webdav fixes

This commit is contained in:
Robin 2010-05-11 20:35:29 +02:00
parent 672297531b
commit 9e05a0d592
5 changed files with 62 additions and 30 deletions

View File

@ -35,22 +35,28 @@ ob_clean();
if($arguments['action']){
switch($arguments['action']){
case 'delete':
OC_FILES::delete($arguments['dir'],$arguments['file']);
echo (OC_FILES::delete($arguments['dir'],$arguments['file']))?'true':'false';
break;
case 'rename':
OC_FILES::move($arguments['dir'],$arguments['file'],$arguments['dir'],$arguments['newname']);
echo (OC_FILES::move($arguments['dir'],$arguments['file'],$arguments['dir'],$arguments['newname']))?'true':'false';
break;
case 'new':
OC_FILES::newfile($arguments['dir'],$arguments['name'],$arguments['type']);
echo (OC_FILES::newfile($arguments['dir'],$arguments['name'],$arguments['type']))?'true':'false';
break;
case 'move':
OC_FILES::move($arguments['sourcedir'],$arguments['source'],$arguments['targetdir'],$arguments['target']);
echo (OC_FILES::move($arguments['sourcedir'],$arguments['source'],$arguments['targetdir'],$arguments['target']))?'true':'false';
break;
case 'copy':
echo (OC_FILES::copy($arguments['sourcedir'],$arguments['source'],$arguments['targetdir'],$arguments['target']))?'true':'false';
break;
case 'get':
OC_FILES::get($arguments['dir'],$arguments['file']);
break;
case 'getfiles':
echo json_encode(OC_FILES::getdirectorycontent($CONFIG_DATADIRECTORY.'/'.$arguments['dir']));
echo json_encode(OC_FILES::getdirectorycontent($arguments['dir']));
break;
case 'find':
echo json_encode(OC_FILESYSTEM::find($arguments['path']));
break;
case 'login':
if(OC_USER::login($arguments['username'],$arguments['password'])){

View File

@ -229,6 +229,7 @@ class HTTP_WebDAV_Server
// detect requested method names
$method = strtolower($this->_SERVER["REQUEST_METHOD"]);
error_log("serving $method request");
$wrapper = "http_".$method;
// activate HEAD emulation by GET if no HEAD method found

View File

@ -108,21 +108,18 @@
{
// get absolute fs path to requested resource
$fspath = $options["path"];
// sanity check
if (!file_exists($fspath)) {
if (!OC_FILESYSTEM::file_exists($fspath)) {
return false;
}
// prepare property array
$files["files"] = array();
// store information for the requested path itself
$files["files"][] = $this->fileinfo($options["path"]);
// information for contained resources requested?
if (!empty($options["depth"]) && OC_FILESYSTEM::is_dir($fspath) && OC_FILESYSTEM::is_readable($fspath)) {
// make sure path ends with '/'
$options["path"] = $this->_slashify($options["path"]);
@ -159,19 +156,16 @@
$info = array();
// TODO remove slash append code when base clase is able to do it itself
$info["path"] = OC_FILESYSTEM::is_dir($fspath) ? $this->_slashify($path) : $path;
$info["props"] = array();
$info["props"] = array();
// no special beautified displayname here ...
$info["props"][] = $this->mkprop("displayname", strtoupper($path));
// creation and modification time
$info["props"][] = $this->mkprop("creationdate", OC_FILESYSTEM::filectime($fspath));
$info["props"][] = $this->mkprop("getlastmodified", OC_FILESYSTEM::filemtime($fspath));
// Microsoft extensions: last access time and 'hidden' status
$info["props"][] = $this->mkprop("lastaccessed", OC_FILESYSTEM::fileatime($fspath));
$info["props"][] = $this->mkprop("ishidden", ('.' === substr(basename($fspath), 0, 1)));
// type and size (caller already made sure that path exists)
if ( OC_FILESYSTEM::is_dir($fspath)) {
// directory (WebDAV collection)
@ -187,15 +181,12 @@
}
$info["props"][] = $this->mkprop("getcontentlength", OC_FILESYSTEM::filesize($fspath));
}
// get additional properties from database
$query = "SELECT ns, name, value FROM properties WHERE path = '$path'";
$res = OC_DB::query($query);
while ($row = OC_DB::fetch_assoc($res)) {
$res = OC_DB::select($query);
while ($row = $res[0]) {
$info["props"][] = $this->mkprop($row["ns"], $row["name"], $row["value"]);
}
OC_DB::free_result($res);
return $info;
}
@ -295,7 +286,7 @@
{
// get absolute fs path to requested resource)
$fspath = $options["path"];
error_log("get '$fspath'");
error_log("get $fspath");
// is this a collection?
if (OC_FILESYSTEM::is_dir($fspath)) {
return $this->GetDir($fspath, $options);
@ -456,7 +447,6 @@
$query = "DELETE FROM properties WHERE path LIKE '".$this->_slashify($options["path"])."%'";
OC_DB::query($query);
// System::rm(array("-rf, $path"));
error_log('delTree');
OC_FILESYSTEM::delTree($path);
} else {
OC_FILESYSTEM::unlink($path);
@ -605,6 +595,7 @@
} else {
if (!OC_FILESYSTEM::copy($file, $destfile)) {
error_log("copy $file to $destfile failed");
return "409 Conflict";
}
}

View File

@ -64,6 +64,8 @@ class OC_FILES {
$stat=OC_FILESYSTEM::stat($directory.'/'.$filename);
$file=array_merge($file,$stat);
$file['mime']=OC_FILES::getMimeType($directory .'/'. $filename);
$file['readable']=OC_FILESYSTEM::is_readable($directory .'/'. $filename);
$file['writeable']=OC_FILESYSTEM::is_writeable($directory .'/'. $filename);
$file['type']=OC_FILESYSTEM::filetype($directory .'/'. $filename);
if($file['type']=='dir'){
$dirs[$file['name']]=$file;
@ -158,7 +160,23 @@ class OC_FILES {
if(OC_USER::isLoggedIn()){
$targetFile=$targetDir.'/'.$target;
$sourceFile=$sourceDir.'/'.$source;
OC_FILESYSTEM::rename($sourceFile,$targetFile);
return OC_FILESYSTEM::rename($sourceFile,$targetFile);
}
}
/**
* copy a file or folder
*
* @param dir $sourceDir
* @param file $source
* @param dir $targetDir
* @param file $target
*/
public static function copy($sourceDir,$source,$targetDir,$target){
if(OC_USER::isLoggedIn()){
$targetFile=$targetDir.'/'.$target;
$sourceFile=$sourceDir.'/'.$source;
return OC_FILESYSTEM::copy($sourceFile,$targetFile);
}
}
@ -173,10 +191,15 @@ class OC_FILES {
if(OC_USER::isLoggedIn()){
$file=$dir.'/'.$name;
if($type=='dir'){
OC_FILESYSTEM::mkdir($file);
return OC_FILESYSTEM::mkdir($file);
}elseif($type=='file'){
$fileHandle=OC_FILESYSTEM::fopen($file, 'w') or die("can't open file");
fclose($fileHandle);
$fileHandle=OC_FILESYSTEM::fopen($file, 'w');
if($fileHandle){
fclose($fileHandle);
return true;
}else{
return false;
}
}
}
}
@ -191,9 +214,9 @@ class OC_FILES {
if(OC_USER::isLoggedIn()){
$file=$dir.'/'.$file;
if(OC_FILESYSTEM::is_file($file)){
OC_FILESYSTEM::unlink($file);
return OC_FILESYSTEM::unlink($file);
}elseif(OC_FILESYSTEM::is_dir($file)){
OC_FILESYSTEM::delTree($file);
return OC_FILESYSTEM::delTree($file);
}
}
}

View File

@ -39,11 +39,22 @@ if(empty($_SERVER['PHP_AUTH_USER']) && empty($_SERVER['REDIRECT_REMOTE_USER']))
$user=$_SERVER['PHP_AUTH_USER'];
$passwd=$_SERVER['PHP_AUTH_PW'];
if(OC_USER::login($user,$passwd)){
$CONFIG_DATADIRECTORY=$CONFIG_DATADIRECTORY_ROOT.'/'.$_SESSION['username_clean'];
$CONFIG_DATADIRECTORY=$CONFIG_DATADIRECTORY_ROOT.'/'.$user;
if(!is_dir($CONFIG_DATADIRECTORY)){
mkdir($CONFIG_DATADIRECTORY);
}
$rootStorage=new OC_FILESTORAGE_LOCAL(array('datadir'=>$CONFIG_DATADIRECTORY));
if($CONFIG_ENABLEBACKUP){
if(!is_dir($CONFIG_BACKUPDIRECTORY)){
mkdir($CONFIG_BACKUPDIRECTORY);
}
if(!is_dir($CONFIG_BACKUPDIRECTORY.'/'.$user)){
mkdir($CONFIG_BACKUPDIRECTORY.'/'.$user);
}
$backupStorage=new OC_FILESTORAGE_LOCAL(array('datadir'=>$CONFIG_BACKUPDIRECTORY.'/'.$user));
$backup=new OC_FILEOBSERVER_BACKUP(array('storage'=>$backupStorage));
$rootStorage->addObserver($backup);
}
OC_FILESYSTEM::mount($rootStorage,'/');
$server = new HTTP_WebDAV_Server_Filesystem();
$server->db_name = $CONFIG_DBNAME;
@ -57,4 +68,4 @@ if(OC_USER::login($user,$passwd)){
?>
?>