This commit is contained in:
Thomas Müller 2015-03-12 21:43:41 +01:00
parent 68a7041348
commit 5855108e9b
9 changed files with 72 additions and 185 deletions

View File

@ -627,11 +627,7 @@ class AmazonS3 extends \OC\Files\Storage\Common {
* check if curl is installed
*/
public static function checkDependencies() {
if (function_exists('curl_init')) {
return true;
} else {
return array('curl');
}
return true;
}
}

View File

@ -316,11 +316,7 @@ class Dropbox extends \OC\Files\Storage\Common {
* check if curl is installed
*/
public static function checkDependencies() {
if (function_exists('curl_init')) {
return true;
} else {
return array('curl');
}
return true;
}
}

View File

@ -617,11 +617,7 @@ class Google extends \OC\Files\Storage\Common {
* check if curl is installed
*/
public static function checkDependencies() {
if (function_exists('curl_init')) {
return true;
} else {
return array('curl');
}
return true;
}
}

View File

@ -567,11 +567,7 @@ class Swift extends \OC\Files\Storage\Common {
* check if curl is installed
*/
public static function checkDependencies() {
if (function_exists('curl_init')) {
return true;
} else {
return array('curl');
}
return true;
}
}

View File

@ -512,11 +512,7 @@ class DAV extends \OC\Files\Storage\Common {
* check if curl is installed
*/
public static function checkDependencies() {
if (function_exists('curl_init')) {
return true;
} else {
return array('curl');
}
return true;
}
/** {@inheritdoc} */

View File

@ -60,82 +60,68 @@ class HTTPHelper {
$proxy = $this->config->getSystemValue('proxy', null);
$proxyUserPwd = $this->config->getSystemValue('proxyuserpwd', null);
if (function_exists('curl_init')) {
$curl = curl_init();
$max_redirects = 10;
$curl = curl_init();
$max_redirects = 10;
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
curl_setopt($curl, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
curl_setopt($curl, CURLOPT_USERAGENT, self::USER_AGENT);
if ($proxy !== null) {
curl_setopt($curl, CURLOPT_PROXY, $proxy);
}
if ($proxyUserPwd !== null) {
curl_setopt($curl, CURLOPT_PROXYUSERPWD, $proxyUserPwd);
}
if (ini_get('open_basedir') === '') {
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_MAXREDIRS, $max_redirects);
$data = curl_exec($curl);
} else {
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
$mr = $max_redirects;
if ($mr > 0) {
$newURL = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);
$rcurl = curl_copy_handle($curl);
curl_setopt($rcurl, CURLOPT_HEADER, true);
curl_setopt($rcurl, CURLOPT_NOBODY, true);
curl_setopt($rcurl, CURLOPT_FORBID_REUSE, false);
curl_setopt($rcurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($rcurl, CURLOPT_USERAGENT, self::USER_AGENT);
do {
curl_setopt($rcurl, CURLOPT_URL, $newURL);
$header = curl_exec($rcurl);
if (curl_errno($rcurl)) {
$code = 0;
} else {
$code = curl_getinfo($rcurl, CURLINFO_HTTP_CODE);
if ($code == 301 || $code == 302) {
preg_match('/Location:(.*?)\n/', $header, $matches);
$newURL = trim(array_pop($matches));
} else {
$code = 0;
}
}
} while ($code && --$mr);
curl_close($rcurl);
if ($mr > 0) {
curl_setopt($curl, CURLOPT_URL, $newURL);
}
}
if ($mr == 0 && $max_redirects > 0) {
$data = false;
} else {
$data = curl_exec($curl);
}
}
curl_close($curl);
} else {
$url = $this->getFinalLocationOfURL($url);
$contextArray = $this->getDefaultContextArray();
if ($proxy !== null) {
$contextArray['http']['proxy'] = $proxy;
}
$ctx = stream_context_create(
$contextArray
);
$data = @file_get_contents($url, 0, $ctx);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
curl_setopt($curl, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
curl_setopt($curl, CURLOPT_USERAGENT, self::USER_AGENT);
if ($proxy !== null) {
curl_setopt($curl, CURLOPT_PROXY, $proxy);
}
if ($proxyUserPwd !== null) {
curl_setopt($curl, CURLOPT_PROXYUSERPWD, $proxyUserPwd);
}
if (ini_get('open_basedir') === '') {
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_MAXREDIRS, $max_redirects);
$data = curl_exec($curl);
} else {
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
$mr = $max_redirects;
if ($mr > 0) {
$newURL = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);
$rCurl = curl_copy_handle($curl);
curl_setopt($rCurl, CURLOPT_HEADER, true);
curl_setopt($rCurl, CURLOPT_NOBODY, true);
curl_setopt($rCurl, CURLOPT_FORBID_REUSE, false);
curl_setopt($rCurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($rCurl, CURLOPT_USERAGENT, self::USER_AGENT);
do {
curl_setopt($rCurl, CURLOPT_URL, $newURL);
$header = curl_exec($rCurl);
if (curl_errno($rCurl)) {
$code = 0;
} else {
$code = curl_getinfo($rCurl, CURLINFO_HTTP_CODE);
if ($code == 301 || $code == 302) {
preg_match('/Location:(.*?)\n/', $header, $matches);
$newURL = trim(array_pop($matches));
} else {
$code = 0;
}
}
} while ($code && --$mr);
curl_close($rCurl);
if ($mr > 0) {
curl_setopt($curl, CURLOPT_URL, $newURL);
}
}
if ($mr == 0 && $max_redirects > 0) {
$data = false;
} else {
$data = curl_exec($curl);
}
}
curl_close($curl);
return $data;
}
@ -158,29 +144,6 @@ class HTTPHelper {
return stripos($url, 'https://') === 0 || stripos($url, 'http://') === 0;
}
/**
* Returns the last HTTP or HTTPS site the request has been redirected too using the Location HTTP header
* This is a very ugly workaround about the missing functionality to restrict fopen() to protocols
* @param string $location Needs to be a HTTPS or HTTP URL
* @throws \Exception In case the initial URL is not a HTTP or HTTPS one
* @return string
*/
public function getFinalLocationOfURL($location) {
if(!$this->isHTTPURL($location)) {
throw new \Exception('URL must begin with HTTPS or HTTP.');
}
$headerArray = $this->getHeaders($location, 1);
if($headerArray !== false && isset($headerArray['Location'])) {
while($this->isHTTPURL($headerArray['Location'])) {
$location = $headerArray['Location'];
$headerArray = $this->getHeaders($location);
}
}
return $location;
}
/**
* create string of parameters for post request
*

View File

@ -94,15 +94,15 @@ class LargeFileHelper {
/**
* @brief Tries to get the size of a file via a CURL HEAD request.
*
* @param string $filename Path to the file.
* @param string $fileName Path to the file.
*
* @return null|int|float Number of bytes as number (float or int) or
* null on failure.
*/
public function getFileSizeViaCurl($filename) {
if (function_exists('curl_init') && \OC::$server->getIniWrapper()->getString('open_basedir') === '') {
$fencoded = rawurlencode($filename);
$ch = curl_init("file://$fencoded");
public function getFileSizeViaCurl($fileName) {
if (\OC::$server->getIniWrapper()->getString('open_basedir') === '') {
$encodedFileName = rawurlencode($fileName);
$ch = curl_init("file://$encodedFileName");
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
@ -129,8 +129,8 @@ class LargeFileHelper {
*/
public function getFileSizeViaCOM($filename) {
if (class_exists('COM')) {
$fsobj = new \COM("Scripting.FileSystemObject");
$file = $fsobj->GetFile($filename);
$fsObj = new \COM("Scripting.FileSystemObject");
$file = $fsObj->GetFile($filename);
return 0 + $file->Size;
}
return null;

View File

@ -184,16 +184,6 @@ class Setup {
'hint' => $this->l10n->t('Please remove the open_basedir setting within your php.ini or switch to 64-bit 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 32-bit PHP environment and cURL is not installed. ' .
'This will lead to problems with files over 4 GB and is highly discouraged.',
$this->defaults->getName()
),
'hint' => $this->l10n->t('Please install the cURL extension and restart your webserver.')
);
}
return array(
'hasSQLite' => isset($databases['sqlite']),

View File

@ -40,49 +40,6 @@ class TestHTTPHelper extends \Test\TestCase {
);
}
/**
* Note: Not using a dataprovider because onConsecutiveCalls expects not
* an array but the function arguments directly
*/
public function testGetFinalLocationOfURLValid() {
$url = 'https://www.owncloud.org/enterprise/';
$expected = 'https://www.owncloud.com/enterprise/';
$this->httpHelperMock->expects($this->any())
->method('getHeaders')
->will($this->onConsecutiveCalls(
array('Location' => 'http://www.owncloud.com/enterprise/'),
array('Location' => 'https://www.owncloud.com/enterprise/')
));
$result = $this->httpHelperMock->getFinalLocationOfURL($url);
$this->assertSame($expected, $result);
}
/**
* Note: Not using a dataprovider because onConsecutiveCalls expects not
* an array but the function arguments directly
*/
public function testGetFinalLocationOfURLInvalid() {
$url = 'https://www.owncloud.org/enterprise/';
$expected = 'http://www.owncloud.com/enterprise/';
$this->httpHelperMock->expects($this->any())
->method('getHeaders')
->will($this->onConsecutiveCalls(
array('Location' => 'http://www.owncloud.com/enterprise/'),
array('Location' => 'file://etc/passwd'),
array('Location' => 'http://www.example.com/')
));
$result = $this->httpHelperMock->getFinalLocationOfURL($url);
$this->assertSame($expected, $result);
}
/**
* @expectedException \Exception
* @expectedExceptionMessage URL must begin with HTTPS or HTTP.
*/
public function testGetFinalLocationOfURLException() {
$this->httpHelperMock->getFinalLocationOfURL('file://etc/passwd');
}
/**
* @dataProvider isHttpTestData
*/
@ -90,11 +47,10 @@ class TestHTTPHelper extends \Test\TestCase {
$this->assertSame($expected, $this->httpHelperMock->isHTTPURL($url));
}
/**
* @dataProvider postParameters
*/
public function testassemblePostParameters($parameterList, $expectedResult) {
public function testAssemblePostParameters($parameterList, $expectedResult) {
$helper = \OC::$server->getHTTPHelper();
$result = \Test_Helper::invokePrivate($helper, 'assemblePostParameters', array($parameterList));
$this->assertSame($expectedResult, $result);
@ -107,6 +63,4 @@ class TestHTTPHelper extends \Test\TestCase {
array(array(), ''),
);
}
}