From 8e190a5a97fd2be24370aa8d3f21b7641506ae92 Mon Sep 17 00:00:00 2001 From: Valerio Ponte Date: Fri, 19 Oct 2012 00:11:20 +0200 Subject: Moved X-Sendfile headers into OC_Files::get now should work with temp files too --- lib/files.php | 59 +++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 20 deletions(-) (limited to 'lib/files.php') diff --git a/lib/files.php b/lib/files.php index e5bf78d032f..24e3b4bfaa7 100644 --- a/lib/files.php +++ b/lib/files.php @@ -42,20 +42,16 @@ class OC_Files { * - versioned */ public static function getFileInfo($path) { - $path = OC_Filesystem::normalizePath($path); if (($path == '/Shared' || substr($path, 0, 8) == '/Shared/') && OC_App::isEnabled('files_sharing')) { if ($path == '/Shared') { list($info) = OCP\Share::getItemsSharedWith('file', OC_Share_Backend_File::FORMAT_FILE_APP_ROOT); - } else { - $info = array(); - if (OC_Filesystem::file_exists($path)) { - $info['size'] = OC_Filesystem::filesize($path); - $info['mtime'] = OC_Filesystem::filemtime($path); - $info['ctime'] = OC_Filesystem::filectime($path); - $info['mimetype'] = OC_Filesystem::getMimeType($path); - $info['encrypted'] = false; - $info['versioned'] = false; - } + }else{ + $info['size'] = OC_Filesystem::filesize($path); + $info['mtime'] = OC_Filesystem::filemtime($path); + $info['ctime'] = OC_Filesystem::filectime($path); + $info['mimetype'] = OC_Filesystem::getMimeType($path); + $info['encrypted'] = false; + $info['versioned'] = false; } } else { $info = OC_FileCache::get($path); @@ -91,13 +87,13 @@ class OC_Files { foreach ($files as &$file) { $file['directory'] = $directory; $file['type'] = ($file['mimetype'] == 'httpd/unix-directory') ? 'dir' : 'file'; - $permissions = OCP\PERMISSION_READ; + $permissions = OCP\Share::PERMISSION_READ; // NOTE: Remove check when new encryption is merged if (!$file['encrypted']) { - $permissions |= OCP\PERMISSION_SHARE; + $permissions |= OCP\Share::PERMISSION_SHARE; } if ($file['type'] == 'dir' && $file['writable']) { - $permissions |= OCP\PERMISSION_CREATE; + $permissions |= OCP\Share::PERMISSION_CREATE; } if ($file['writable']) { $permissions |= OCP\PERMISSION_UPDATE | OCP\PERMISSION_DELETE; @@ -140,6 +136,10 @@ class OC_Files { * @param boolean $only_header ; boolean to only send header of the request */ public static function get($dir, $files, $only_header = false) { + $xsendfile = false; + if (isset($_SERVER['MOD_X_SENDFILE_ENABLED']) || + isset($_SERVER['MOD_X_ACCEL_REDIRECT_ENABLED'])) + $xsendfile = true; if(strpos($files, ';')) { $files=explode(';', $files); } @@ -149,8 +149,11 @@ class OC_Files { $executionTime = intval(ini_get('max_execution_time')); set_time_limit(0); $zip = new ZipArchive(); - $filename = OC_Helper::tmpFile('.zip'); - if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)!==true) { + if ($xsendfile) + $filename = OC_Helper::tmpFileNoClean('.zip'); + else + $filename = OC_Helper::tmpFile('.zip'); + if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)!==TRUE) { exit("cannot open <$filename>\n"); } foreach($files as $file) { @@ -170,8 +173,11 @@ class OC_Files { $executionTime = intval(ini_get('max_execution_time')); set_time_limit(0); $zip = new ZipArchive(); - $filename = OC_Helper::tmpFile('.zip'); - if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)!==true) { + if ($xsendfile) + $filename = OC_Helper::tmpFileNoClean('.zip'); + else + $filename = OC_Helper::tmpFile('.zip'); + if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)!==TRUE) { exit("cannot open <$filename>\n"); } $file=$dir.'/'.$files; @@ -191,8 +197,12 @@ class OC_Files { ini_set('zlib.output_compression', 'off'); header('Content-Type: application/zip'); header('Content-Length: ' . filesize($filename)); + self::addSendfileHeader($filename); }else{ header('Content-Type: '.OC_Filesystem::getMimeType($filename)); + $storage = OC_Filesystem::getStorage($filename); + if ($storage instanceof OC_Filestorage_Local) + self::addSendfileHeader(OC_Filesystem::getLocalFile($filename)); } }elseif($zip or !OC_Filesystem::file_exists($filename)) { header("HTTP/1.0 404 Not Found"); @@ -217,7 +227,8 @@ class OC_Files { flush(); } } - unlink($filename); + if (!$xsendfile) + unlink($filename); }else{ OC_Filesystem::readfile($filename); } @@ -228,11 +239,19 @@ class OC_Files { } } + private static function addSendfileHeader($filename) { + if (isset($_SERVER['MOD_X_SENDFILE_ENABLED'])) { + header("X-Sendfile: " . $filename); + } + if (isset($_SERVER['MOD_X_ACCEL_REDIRECT_ENABLED'])) + header("X-Accel-Redirect: " . $filename); + } + public static function zipAddDir($dir, $zip, $internalDir='') { $dirname=basename($dir); $zip->addEmptyDir($internalDir.$dirname); $internalDir.=$dirname.='/'; - $files=OC_Files::getdirectorycontent($dir); + $files=OC_Files::getDirectoryContent($dir); foreach($files as $file) { $filename=$file['name']; $file=$dir.'/'.$filename; -- cgit v1.2.3 From de7e419610d3fde8a16367776279d76837a0ee62 Mon Sep 17 00:00:00 2001 From: Valerio Ponte Date: Tue, 30 Oct 2012 23:37:31 +0100 Subject: Fixed style according to owncloud styleguide --- lib/files.php | 50 ++++++++++++++++++++++++++++++-------------------- lib/helper.php | 3 ++- 2 files changed, 32 insertions(+), 21 deletions(-) (limited to 'lib/files.php') diff --git a/lib/files.php b/lib/files.php index 24e3b4bfaa7..912de5655b0 100644 --- a/lib/files.php +++ b/lib/files.php @@ -42,16 +42,20 @@ class OC_Files { * - versioned */ public static function getFileInfo($path) { + $path = OC_Filesystem::normalizePath($path); if (($path == '/Shared' || substr($path, 0, 8) == '/Shared/') && OC_App::isEnabled('files_sharing')) { if ($path == '/Shared') { list($info) = OCP\Share::getItemsSharedWith('file', OC_Share_Backend_File::FORMAT_FILE_APP_ROOT); - }else{ - $info['size'] = OC_Filesystem::filesize($path); - $info['mtime'] = OC_Filesystem::filemtime($path); - $info['ctime'] = OC_Filesystem::filectime($path); - $info['mimetype'] = OC_Filesystem::getMimeType($path); - $info['encrypted'] = false; - $info['versioned'] = false; + } else { + $info = array(); + if (OC_Filesystem::file_exists($path)) { + $info['size'] = OC_Filesystem::filesize($path); + $info['mtime'] = OC_Filesystem::filemtime($path); + $info['ctime'] = OC_Filesystem::filectime($path); + $info['mimetype'] = OC_Filesystem::getMimeType($path); + $info['encrypted'] = false; + $info['versioned'] = false; + } } } else { $info = OC_FileCache::get($path); @@ -87,13 +91,13 @@ class OC_Files { foreach ($files as &$file) { $file['directory'] = $directory; $file['type'] = ($file['mimetype'] == 'httpd/unix-directory') ? 'dir' : 'file'; - $permissions = OCP\Share::PERMISSION_READ; + $permissions = OCP\PERMISSION_READ; // NOTE: Remove check when new encryption is merged if (!$file['encrypted']) { - $permissions |= OCP\Share::PERMISSION_SHARE; + $permissions |= OCP\PERMISSION_SHARE; } if ($file['type'] == 'dir' && $file['writable']) { - $permissions |= OCP\Share::PERMISSION_CREATE; + $permissions |= OCP\PERMISSION_CREATE; } if ($file['writable']) { $permissions |= OCP\PERMISSION_UPDATE | OCP\PERMISSION_DELETE; @@ -138,8 +142,9 @@ class OC_Files { public static function get($dir, $files, $only_header = false) { $xsendfile = false; if (isset($_SERVER['MOD_X_SENDFILE_ENABLED']) || - isset($_SERVER['MOD_X_ACCEL_REDIRECT_ENABLED'])) + isset($_SERVER['MOD_X_ACCEL_REDIRECT_ENABLED'])) { $xsendfile = true; + } if(strpos($files, ';')) { $files=explode(';', $files); } @@ -149,11 +154,12 @@ class OC_Files { $executionTime = intval(ini_get('max_execution_time')); set_time_limit(0); $zip = new ZipArchive(); - if ($xsendfile) + if ($xsendfile) { $filename = OC_Helper::tmpFileNoClean('.zip'); - else + }else{ $filename = OC_Helper::tmpFile('.zip'); - if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)!==TRUE) { + } + if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)!==true) { exit("cannot open <$filename>\n"); } foreach($files as $file) { @@ -173,11 +179,12 @@ class OC_Files { $executionTime = intval(ini_get('max_execution_time')); set_time_limit(0); $zip = new ZipArchive(); - if ($xsendfile) + if ($xsendfile) { $filename = OC_Helper::tmpFileNoClean('.zip'); - else + }else{ $filename = OC_Helper::tmpFile('.zip'); - if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)!==TRUE) { + } + if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)!==true) { exit("cannot open <$filename>\n"); } $file=$dir.'/'.$files; @@ -201,8 +208,9 @@ class OC_Files { }else{ header('Content-Type: '.OC_Filesystem::getMimeType($filename)); $storage = OC_Filesystem::getStorage($filename); - if ($storage instanceof OC_Filestorage_Local) + if ($storage instanceof OC_Filestorage_Local) { self::addSendfileHeader(OC_Filesystem::getLocalFile($filename)); + } } }elseif($zip or !OC_Filesystem::file_exists($filename)) { header("HTTP/1.0 404 Not Found"); @@ -227,8 +235,9 @@ class OC_Files { flush(); } } - if (!$xsendfile) + if (!$xsendfile) { unlink($filename); + } }else{ OC_Filesystem::readfile($filename); } @@ -243,8 +252,9 @@ class OC_Files { if (isset($_SERVER['MOD_X_SENDFILE_ENABLED'])) { header("X-Sendfile: " . $filename); } - if (isset($_SERVER['MOD_X_ACCEL_REDIRECT_ENABLED'])) + if (isset($_SERVER['MOD_X_ACCEL_REDIRECT_ENABLED'])) { header("X-Accel-Redirect: " . $filename); + } } public static function zipAddDir($dir, $zip, $internalDir='') { diff --git a/lib/helper.php b/lib/helper.php index b5e2b8a0d4e..339a12dc1ed 100644 --- a/lib/helper.php +++ b/lib/helper.php @@ -534,8 +534,9 @@ class OC_Helper { public static function tmpFileNoClean($postfix='') { $tmpDirNoClean=get_temp_dir().'/oc-noclean/'; if (!file_exists($tmpDirNoClean) || !is_dir($tmpDirNoClean)) { - if (file_exists($tmpDirNoClean)) + if (file_exists($tmpDirNoClean)) { unlink($tmpDirNoClean); + } mkdir($tmpDirNoClean); } $file=$tmpDirNoClean.md5(time().rand()).$postfix; -- cgit v1.2.3