From 2e365658c856e1dffd1ee748db40158fdda0edc3 Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
Date: Sat, 3 Mar 2012 18:02:07 +0100
Subject: [PATCH] better handeling of files that can behave like folder (e.g.
 archives)

---
 files/index.php           |  2 +-
 lib/filecache.php         |  7 ++++---
 lib/filestorage/local.php |  2 +-
 lib/filesystem.php        | 10 ++++------
 lib/filesystemview.php    |  1 +
 5 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/files/index.php b/files/index.php
index a29d3fb7e1..79261e495b 100644
--- a/files/index.php
+++ b/files/index.php
@@ -40,7 +40,7 @@ OC_App::setActiveNavigationEntry( "files_index" );
 // Load the files
 $dir = isset( $_GET['dir'] ) ? stripslashes($_GET['dir']) : '';
 // Redirect if directory does not exist
-if(!OC_Filesystem::is_dir($dir)) {
+if(!OC_Filesystem::is_dir($dir.'/')) {
 	header("Location: ".$_SERVER['PHP_SELF']."");
 }
 
diff --git a/lib/filecache.php b/lib/filecache.php
index 732160c216..e94ae49c73 100644
--- a/lib/filecache.php
+++ b/lib/filecache.php
@@ -323,10 +323,11 @@ class OC_FileCache{
 		$path=$params['path'];
 		$fullPath=$view->getRoot().$path;
 		$mimetype=$view->getMimeType($path);
+		$dir=$view->is_dir($path.'/');
 		//dont use self::get here, we don't want inifinte loops when a file has changed
 		$cachedSize=self::getCachedSize($path,$root);
 		$size=0;
-		if($mimetype=='httpd/unix-directory'){
+		if($dir){
 			if(self::inCache($path,$root)){
 				$parent=self::getFileId($fullPath);
 				$query=OC_DB::prepare('SELECT size FROM *PREFIX*fscache WHERE parent=?');
@@ -465,13 +466,13 @@ class OC_FileCache{
 			$view=new OC_FilesystemView(($root=='/')?'':$root);
 		}
 		self::scanFile($path,$root);
-		$dh=$view->opendir($path);
+		$dh=$view->opendir($path.'/');
 		$totalSize=0;
 		if($dh){
 			while (($filename = readdir($dh)) !== false) {
 				if($filename != '.' and $filename != '..'){
 					$file=$path.'/'.$filename;
-					if($view->is_dir($file)){
+					if($view->is_dir($file.'/')){
 						if($eventSource){
 							$eventSource->send('scanning',array('file'=>$file,'count'=>$count));
 						}
diff --git a/lib/filestorage/local.php b/lib/filestorage/local.php
index 8e07ce6025..750a1fb36d 100644
--- a/lib/filestorage/local.php
+++ b/lib/filestorage/local.php
@@ -21,7 +21,7 @@ class OC_Filestorage_Local extends OC_Filestorage{
 		return opendir($this->datadir.$path);
 	}
 	public function is_dir($path){
-		return (is_dir($this->datadir.$path) or substr($path,-1)=='/');
+		return @is_dir($this->datadir.$path);
 	}
 	public function is_file($path){
 		return is_file($this->datadir.$path);
diff --git a/lib/filesystem.php b/lib/filesystem.php
index 5013b3968c..12905d189f 100644
--- a/lib/filesystem.php
+++ b/lib/filesystem.php
@@ -146,20 +146,15 @@ class OC_Filesystem{
 	* @return string
 	*/
 	static public function getMountPoint($path){
+		OC_Hook::emit(self::CLASSNAME,'get_mountpoint',array('path'=>$path));
 		if(!$path){
 			$path='/';
 		}
 		if(substr($path,0,1)!=='/'){
 			$path='/'.$path;
 		}
-		if(substr($path,-1)!=='/'){
-			$path=$path.'/';
-		}
 		$foundMountPoint='';
 		foreach(OC_Filesystem::$mounts as $mountpoint=>$storage){
-			if(substr($mountpoint,-1)!=='/'){
-				$mountpoint=$mountpoint.'/';
-			}
 			if($mountpoint==$path){
 				return $mountpoint;
 			}
@@ -259,6 +254,9 @@ class OC_Filesystem{
 	* @param string mountpoint
 	*/
 	static public function mount($class,$arguments,$mountpoint){
+		if(substr($mountpoint,-1)!=='/'){
+			$mountpoint=$mountpoint.'/';
+		}
 		if(substr($mountpoint,0,1)!=='/'){
 			$mountpoint='/'.$mountpoint;
 		}
diff --git a/lib/filesystemview.php b/lib/filesystemview.php
index 2d54a676c8..89e0385fe9 100644
--- a/lib/filesystemview.php
+++ b/lib/filesystemview.php
@@ -205,6 +205,7 @@ class OC_FilesystemView {
 					$count=OC_Helper::streamCopy($data,$target);
 					$storage1=$this->getStorage($path1);
 					$storage1->unlink($this->getInternalPath($path1));
+					$result=$count>0;
 				}
 				OC_Hook::emit( OC_Filesystem::CLASSNAME, OC_Filesystem::signal_post_rename, array( OC_Filesystem::signal_param_oldpath => $path1, OC_Filesystem::signal_param_newpath=>$path2));
 				return $result;
-- 
GitLab