webdav fixes
This commit is contained in:
parent
672297531b
commit
9e05a0d592
|
@ -35,22 +35,28 @@ ob_clean();
|
||||||
if($arguments['action']){
|
if($arguments['action']){
|
||||||
switch($arguments['action']){
|
switch($arguments['action']){
|
||||||
case 'delete':
|
case 'delete':
|
||||||
OC_FILES::delete($arguments['dir'],$arguments['file']);
|
echo (OC_FILES::delete($arguments['dir'],$arguments['file']))?'true':'false';
|
||||||
break;
|
break;
|
||||||
case 'rename':
|
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;
|
break;
|
||||||
case 'new':
|
case 'new':
|
||||||
OC_FILES::newfile($arguments['dir'],$arguments['name'],$arguments['type']);
|
echo (OC_FILES::newfile($arguments['dir'],$arguments['name'],$arguments['type']))?'true':'false';
|
||||||
break;
|
break;
|
||||||
case 'move':
|
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;
|
break;
|
||||||
case 'get':
|
case 'get':
|
||||||
OC_FILES::get($arguments['dir'],$arguments['file']);
|
OC_FILES::get($arguments['dir'],$arguments['file']);
|
||||||
break;
|
break;
|
||||||
case 'getfiles':
|
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;
|
break;
|
||||||
case 'login':
|
case 'login':
|
||||||
if(OC_USER::login($arguments['username'],$arguments['password'])){
|
if(OC_USER::login($arguments['username'],$arguments['password'])){
|
||||||
|
|
|
@ -229,6 +229,7 @@ class HTTP_WebDAV_Server
|
||||||
|
|
||||||
// detect requested method names
|
// detect requested method names
|
||||||
$method = strtolower($this->_SERVER["REQUEST_METHOD"]);
|
$method = strtolower($this->_SERVER["REQUEST_METHOD"]);
|
||||||
|
error_log("serving $method request");
|
||||||
$wrapper = "http_".$method;
|
$wrapper = "http_".$method;
|
||||||
|
|
||||||
// activate HEAD emulation by GET if no HEAD method found
|
// activate HEAD emulation by GET if no HEAD method found
|
||||||
|
|
|
@ -110,19 +110,16 @@
|
||||||
$fspath = $options["path"];
|
$fspath = $options["path"];
|
||||||
|
|
||||||
// sanity check
|
// sanity check
|
||||||
if (!file_exists($fspath)) {
|
if (!OC_FILESYSTEM::file_exists($fspath)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepare property array
|
// prepare property array
|
||||||
$files["files"] = array();
|
$files["files"] = array();
|
||||||
|
|
||||||
// store information for the requested path itself
|
// store information for the requested path itself
|
||||||
$files["files"][] = $this->fileinfo($options["path"]);
|
$files["files"][] = $this->fileinfo($options["path"]);
|
||||||
|
|
||||||
// information for contained resources requested?
|
// information for contained resources requested?
|
||||||
if (!empty($options["depth"]) && OC_FILESYSTEM::is_dir($fspath) && OC_FILESYSTEM::is_readable($fspath)) {
|
if (!empty($options["depth"]) && OC_FILESYSTEM::is_dir($fspath) && OC_FILESYSTEM::is_readable($fspath)) {
|
||||||
|
|
||||||
// make sure path ends with '/'
|
// make sure path ends with '/'
|
||||||
$options["path"] = $this->_slashify($options["path"]);
|
$options["path"] = $this->_slashify($options["path"]);
|
||||||
|
|
||||||
|
@ -160,18 +157,15 @@
|
||||||
// TODO remove slash append code when base clase is able to do it itself
|
// 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["path"] = OC_FILESYSTEM::is_dir($fspath) ? $this->_slashify($path) : $path;
|
||||||
$info["props"] = array();
|
$info["props"] = array();
|
||||||
|
|
||||||
// no special beautified displayname here ...
|
// no special beautified displayname here ...
|
||||||
$info["props"][] = $this->mkprop("displayname", strtoupper($path));
|
$info["props"][] = $this->mkprop("displayname", strtoupper($path));
|
||||||
|
|
||||||
// creation and modification time
|
// creation and modification time
|
||||||
$info["props"][] = $this->mkprop("creationdate", OC_FILESYSTEM::filectime($fspath));
|
$info["props"][] = $this->mkprop("creationdate", OC_FILESYSTEM::filectime($fspath));
|
||||||
$info["props"][] = $this->mkprop("getlastmodified", OC_FILESYSTEM::filemtime($fspath));
|
$info["props"][] = $this->mkprop("getlastmodified", OC_FILESYSTEM::filemtime($fspath));
|
||||||
|
|
||||||
// Microsoft extensions: last access time and 'hidden' status
|
// Microsoft extensions: last access time and 'hidden' status
|
||||||
$info["props"][] = $this->mkprop("lastaccessed", OC_FILESYSTEM::fileatime($fspath));
|
$info["props"][] = $this->mkprop("lastaccessed", OC_FILESYSTEM::fileatime($fspath));
|
||||||
$info["props"][] = $this->mkprop("ishidden", ('.' === substr(basename($fspath), 0, 1)));
|
$info["props"][] = $this->mkprop("ishidden", ('.' === substr(basename($fspath), 0, 1)));
|
||||||
|
|
||||||
// type and size (caller already made sure that path exists)
|
// type and size (caller already made sure that path exists)
|
||||||
if ( OC_FILESYSTEM::is_dir($fspath)) {
|
if ( OC_FILESYSTEM::is_dir($fspath)) {
|
||||||
// directory (WebDAV collection)
|
// directory (WebDAV collection)
|
||||||
|
@ -187,15 +181,12 @@
|
||||||
}
|
}
|
||||||
$info["props"][] = $this->mkprop("getcontentlength", OC_FILESYSTEM::filesize($fspath));
|
$info["props"][] = $this->mkprop("getcontentlength", OC_FILESYSTEM::filesize($fspath));
|
||||||
}
|
}
|
||||||
|
|
||||||
// get additional properties from database
|
// get additional properties from database
|
||||||
$query = "SELECT ns, name, value FROM properties WHERE path = '$path'";
|
$query = "SELECT ns, name, value FROM properties WHERE path = '$path'";
|
||||||
$res = OC_DB::query($query);
|
$res = OC_DB::select($query);
|
||||||
while ($row = OC_DB::fetch_assoc($res)) {
|
while ($row = $res[0]) {
|
||||||
$info["props"][] = $this->mkprop($row["ns"], $row["name"], $row["value"]);
|
$info["props"][] = $this->mkprop($row["ns"], $row["name"], $row["value"]);
|
||||||
}
|
}
|
||||||
OC_DB::free_result($res);
|
|
||||||
|
|
||||||
return $info;
|
return $info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -295,7 +286,7 @@
|
||||||
{
|
{
|
||||||
// get absolute fs path to requested resource)
|
// get absolute fs path to requested resource)
|
||||||
$fspath = $options["path"];
|
$fspath = $options["path"];
|
||||||
error_log("get '$fspath'");
|
error_log("get $fspath");
|
||||||
// is this a collection?
|
// is this a collection?
|
||||||
if (OC_FILESYSTEM::is_dir($fspath)) {
|
if (OC_FILESYSTEM::is_dir($fspath)) {
|
||||||
return $this->GetDir($fspath, $options);
|
return $this->GetDir($fspath, $options);
|
||||||
|
@ -456,7 +447,6 @@
|
||||||
$query = "DELETE FROM properties WHERE path LIKE '".$this->_slashify($options["path"])."%'";
|
$query = "DELETE FROM properties WHERE path LIKE '".$this->_slashify($options["path"])."%'";
|
||||||
OC_DB::query($query);
|
OC_DB::query($query);
|
||||||
// System::rm(array("-rf, $path"));
|
// System::rm(array("-rf, $path"));
|
||||||
error_log('delTree');
|
|
||||||
OC_FILESYSTEM::delTree($path);
|
OC_FILESYSTEM::delTree($path);
|
||||||
} else {
|
} else {
|
||||||
OC_FILESYSTEM::unlink($path);
|
OC_FILESYSTEM::unlink($path);
|
||||||
|
@ -605,6 +595,7 @@
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (!OC_FILESYSTEM::copy($file, $destfile)) {
|
if (!OC_FILESYSTEM::copy($file, $destfile)) {
|
||||||
|
error_log("copy $file to $destfile failed");
|
||||||
return "409 Conflict";
|
return "409 Conflict";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,6 +64,8 @@ class OC_FILES {
|
||||||
$stat=OC_FILESYSTEM::stat($directory.'/'.$filename);
|
$stat=OC_FILESYSTEM::stat($directory.'/'.$filename);
|
||||||
$file=array_merge($file,$stat);
|
$file=array_merge($file,$stat);
|
||||||
$file['mime']=OC_FILES::getMimeType($directory .'/'. $filename);
|
$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);
|
$file['type']=OC_FILESYSTEM::filetype($directory .'/'. $filename);
|
||||||
if($file['type']=='dir'){
|
if($file['type']=='dir'){
|
||||||
$dirs[$file['name']]=$file;
|
$dirs[$file['name']]=$file;
|
||||||
|
@ -158,7 +160,23 @@ class OC_FILES {
|
||||||
if(OC_USER::isLoggedIn()){
|
if(OC_USER::isLoggedIn()){
|
||||||
$targetFile=$targetDir.'/'.$target;
|
$targetFile=$targetDir.'/'.$target;
|
||||||
$sourceFile=$sourceDir.'/'.$source;
|
$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()){
|
if(OC_USER::isLoggedIn()){
|
||||||
$file=$dir.'/'.$name;
|
$file=$dir.'/'.$name;
|
||||||
if($type=='dir'){
|
if($type=='dir'){
|
||||||
OC_FILESYSTEM::mkdir($file);
|
return OC_FILESYSTEM::mkdir($file);
|
||||||
}elseif($type=='file'){
|
}elseif($type=='file'){
|
||||||
$fileHandle=OC_FILESYSTEM::fopen($file, 'w') or die("can't open file");
|
$fileHandle=OC_FILESYSTEM::fopen($file, 'w');
|
||||||
|
if($fileHandle){
|
||||||
fclose($fileHandle);
|
fclose($fileHandle);
|
||||||
|
return true;
|
||||||
|
}else{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -191,9 +214,9 @@ class OC_FILES {
|
||||||
if(OC_USER::isLoggedIn()){
|
if(OC_USER::isLoggedIn()){
|
||||||
$file=$dir.'/'.$file;
|
$file=$dir.'/'.$file;
|
||||||
if(OC_FILESYSTEM::is_file($file)){
|
if(OC_FILESYSTEM::is_file($file)){
|
||||||
OC_FILESYSTEM::unlink($file);
|
return OC_FILESYSTEM::unlink($file);
|
||||||
}elseif(OC_FILESYSTEM::is_dir($file)){
|
}elseif(OC_FILESYSTEM::is_dir($file)){
|
||||||
OC_FILESYSTEM::delTree($file);
|
return OC_FILESYSTEM::delTree($file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,11 +39,22 @@ if(empty($_SERVER['PHP_AUTH_USER']) && empty($_SERVER['REDIRECT_REMOTE_USER']))
|
||||||
$user=$_SERVER['PHP_AUTH_USER'];
|
$user=$_SERVER['PHP_AUTH_USER'];
|
||||||
$passwd=$_SERVER['PHP_AUTH_PW'];
|
$passwd=$_SERVER['PHP_AUTH_PW'];
|
||||||
if(OC_USER::login($user,$passwd)){
|
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)){
|
if(!is_dir($CONFIG_DATADIRECTORY)){
|
||||||
mkdir($CONFIG_DATADIRECTORY);
|
mkdir($CONFIG_DATADIRECTORY);
|
||||||
}
|
}
|
||||||
$rootStorage=new OC_FILESTORAGE_LOCAL(array('datadir'=>$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,'/');
|
OC_FILESYSTEM::mount($rootStorage,'/');
|
||||||
$server = new HTTP_WebDAV_Server_Filesystem();
|
$server = new HTTP_WebDAV_Server_Filesystem();
|
||||||
$server->db_name = $CONFIG_DBNAME;
|
$server->db_name = $CONFIG_DBNAME;
|
||||||
|
|
Loading…
Reference in New Issue