]> source.dussan.org Git - nextcloud-server.git/commitdiff
log read/write files
authorThibaut GRIDEL <tgridel@free.fr>
Mon, 3 May 2010 20:26:34 +0000 (22:26 +0200)
committerThibaut GRIDEL <tgridel@free.fr>
Sun, 16 May 2010 19:26:24 +0000 (21:26 +0200)
inc/HTTP/WebDAV/Server/Filesystem.php
inc/lib_files.php

index e11e3b3f5c9bf3b28f06d592fd6a76f7287b67b0..670d082691bb68bc107e2dec4e643cbd104f48c1 100755 (executable)
    | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      |
    | POSSIBILITY OF SUCH DAMAGE.                                          |
    +----------------------------------------------------------------------+
-*/    
+*/
     require_once("../inc/lib_base.php");
+    oc_require_once("lib_log.php");
     oc_require_once("HTTP/WebDAV/Server.php");
     oc_require_once("System.php");
-    
+
     /**
      * Filesystem access using WebDAV
      *
@@ -43,7 +44,7 @@
      * @author  Hartmut Holzgraefe <hartmut@php.net>
      * @version @package-version@
      */
-    class HTTP_WebDAV_Server_Filesystem extends HTTP_WebDAV_Server 
+    class HTTP_WebDAV_Server_Filesystem extends HTTP_WebDAV_Server
     {
     /**
      * Root directory for WebDAV access
@@ -59,9 +60,9 @@
      * Serve a webdav request
      *
      * @access public
-     * @param  string  
+     * @param  string
      */
-    function ServeRequest($base = false) 
+    function ServeRequest($base = false)
     {
             // special treatment for litmus compliance test
             // reply on its identifier header
@@ -77,7 +78,7 @@
         } else if (!$this->base) {
             $this->base = $this->_SERVER['DOCUMENT_ROOT'];
         }
-                
+
         // let the base class do all the work
         parent::ServeRequest();
     }
@@ -91,7 +92,7 @@
      * @param  string  Password
      * @return bool    true on successful authentication
      */
-    function check_auth($type, $user, $pass) 
+    function check_auth($type, $user, $pass)
     {
         return true;
     }
      * @param  array  return array for file properties
      * @return bool   true on success
      */
-    function PROPFIND(&$options, &$files) 
+    function PROPFIND(&$options, &$files)
     {
         // get absolute fs path to requested resource
         $fspath = $options["path"];
-               
+
         // sanity check
         if (!OC_FILESYSTEM::file_exists($fspath)) {
             return false;
         // 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)) {                
+        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"]);
 
             // try to open directory
                 $handle = @OC_FILESYSTEM::opendir($fspath);
-                
+
             if ($handle) {
                 // ok, now get all its contents
                 while ($filename = readdir($handle)) {
 
         // ok, all done
         return true;
-    } 
-        
+    }
+
     /**
      * Get properties for a single file/resource
      *
      * @param  string  resource path
      * @return array   resource properties
      */
-    function fileinfo($path) 
+    function fileinfo($path)
     {
         // map URI path to filesystem path
         $fspath =$path;
         // create result array
         $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["path"]  = OC_FILESYSTEM::is_dir($fspath) ? $this->_slashify($path) : $path;
+        $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));
         if ( OC_FILESYSTEM::is_dir($fspath)) {
             // directory (WebDAV collection)
             $info["props"][] = $this->mkprop("resourcetype", "collection");
-            $info["props"][] = $this->mkprop("getcontenttype", "httpd/unix-directory");             
+            $info["props"][] = $this->mkprop("getcontenttype", "httpd/unix-directory");
         } else {
             // plain file (WebDAV resource)
             $info["props"][] = $this->mkprop("resourcetype", "");
                 $info["props"][] = $this->mkprop("getcontenttype", $this->_mimetype($fspath));
             } else {
                 $info["props"][] = $this->mkprop("getcontenttype", "application/x-non-readable");
-            }               
+            }
             $info["props"][] = $this->mkprop("getcontentlength",  OC_FILESYSTEM::filesize($fspath));
         }
         // get additional properties from database
     /**
      * detect if a given program is found in the search PATH
      *
-     * helper function used by _mimetype() to detect if the 
+     * helper function used by _mimetype() to detect if the
      * external 'file' utility is available
      *
      * @param  string  program name
      * @param  string  optional search path, defaults to $PATH
      * @return bool    true if executable program found in path
      */
-    function _can_execute($name, $path = false) 
+    function _can_execute($name, $path = false)
     {
         // path defaults to PATH from environment if not set
         if ($path === false) {
             $path = getenv("PATH");
         }
-            
+
         // check method depends on operating system
         if (!strncmp(PHP_OS, "WIN", 3)) {
             // on Windows an appropriate COM or EXE file needs to exist
             $exts     = array("");
             $check_fn = "is_executable";
         }
-            
+
         // now check the directories in the path for the program
         foreach (explode(PATH_SEPARATOR, $path) as $dir) {
             // skip invalid path entries
         return false;
     }
 
-        
+
     /**
      * try to detect the mime type of a file
      *
      * @param  string  file path
      * @return string  guessed mime type
      */
-    function _mimetype($fspath) 
+    function _mimetype($fspath)
     {
         return  OC_FILESYSTEM::getMimeType($fspath);
-            
+
         return $mime_type;
     }
 
     /**
      * HEAD method handler
-     * 
+     *
      * @param  array  parameter passing array
      * @return bool   true on success
      */
-    function HEAD(&$options) 
+    function HEAD(&$options)
     {
         // get absolute fs path to requested resource
         $fspath = $options["path"];
 
         // sanity check
         if (! OC_FILESYSTEM::file_exists($fspath)) return false;
-            
+
         // detect resource type
-        $options['mimetype'] = $this->_mimetype($fspath); 
-                
+        $options['mimetype'] = $this->_mimetype($fspath);
+
         // detect modification time
         // see rfc2518, section 13.7
         // some clients seem to treat this as a reverse rule
         // requiering a Last-Modified header if the getlastmodified header was set
         $options['mtime'] = OC_FILESYSTEM::filemtime($fspath);
-            
+
         // detect resource size
         $options['size'] = OC_FILESYSTEM::filesize($fspath);
-            
+
         return true;
     }
 
     /**
      * GET method handler
-     * 
+     *
      * @param  array  parameter passing array
      * @return bool   true on success
      */
-    function GET(&$options) 
+    function GET(&$options)
     {
         // get absolute fs path to requested resource)
         $fspath = $options["path"];
 
         // no need to check result here, it is handled by the base class
         $options['stream'] = OC_FILESYSTEM::fopen($fspath, "r");
-            
+        OC_LOG::event($_SESSION['username'],3,$options["path"]);
         return true;
     }
 
      * @param  string  directory path
      * @return void    function has to handle HTTP response itself
      */
-    function GetDir($fspath, &$options) 
+    function GetDir($fspath, &$options)
     {
         $path = $this->_slashify($options["path"]);
         if ($path != $options["path"]) {
         }
 
         echo "<html><head><title>Index of ".htmlspecialchars($options['path'])."</title></head>\n";
-            
+
         echo "<h1>Index of ".htmlspecialchars($options['path'])."</h1>\n";
-            
+
         echo "<pre>";
         printf($format, "Size", "Last modified", "Filename");
         echo "<hr>";
             if ($filename != "." && $filename != "..") {
                 $fullpath = $fspath."/".$filename;
                 $name     = htmlspecialchars($filename);
-                printf($format, 
+                printf($format,
                        number_format(filesize($fullpath)),
-                       strftime("%Y-%m-%d %H:%M:%S", filemtime($fullpath)), 
+                       strftime("%Y-%m-%d %H:%M:%S", filemtime($fullpath)),
                        "<a href='$name'>$name</a>");
             }
         }
 
     /**
      * PUT method handler
-     * 
+     *
      * @param  array  parameter passing array
      * @return bool   true on success
      */
-    function PUT(&$options) 
+    function PUT(&$options)
     {
         $fspath = $options["path"];
 
             return "403 Forbidden";
         }
         $fp = OC_FILESYSTEM::fopen($fspath, "w");
-
+        OC_LOG::event($_SESSION['username'],4,$options["path"]);
         return $fp;
     }
 
      * @param  array  general parameter passing array
      * @return bool   true on success
      */
-    function MKCOL($options) 
-    {           
+    function MKCOL($options)
+    {
         $path   = $options["path"];
         $parent = dirname($path);
         $name   = basename($path);
-               
+
         if (!OC_FILESYSTEM::file_exists($parent)) {
             return "409 Conflict";
         }
         if (!empty($this->_SERVER["CONTENT_LENGTH"])) { // no body parsing yet
             return "415 Unsupported media type";
         }
-            
+
         $stat = OC_FILESYSTEM::mkdir($parent."/".$name, 0777);
         if (!$stat) {
-            return "403 Forbidden";                 
+            return "403 Forbidden";
         }
 
         return ("201 Created");
     }
-        
-        
+
+
     /**
      * DELETE method handler
      *
      * @param  array  general parameter passing array
      * @return bool   true on success
      */
-    function DELETE($options) 
+    function DELETE($options)
     {
         $path =$options["path"];
 
      * @param  array  general parameter passing array
      * @return bool   true on success
      */
-    function MOVE($options) 
+    function MOVE($options)
     {
         return $this->COPY($options, true);
     }
      * @param  array  general parameter passing array
      * @return bool   true on success
      */
-    function COPY($options, $del=false) 
+    function COPY($options, $del=false)
     {
         // TODO Property updates still broken (Litmus should detect this?)
 
 
         if (OC_FILESYSTEM::is_dir($source)) { // resource is a collection
             switch ($options["depth"]) {
-            case "infinity": // valid 
+            case "infinity": // valid
                 break;
             case "0": // valid for COPY only
                 if ($del) { // MOVE?
                 }
                 break;
             case "1": // invalid for both COPY and MOVE
-            default: 
+            default:
                 return "400 Bad request";
             }
         }
 
         $dest         = $options["dest"];
         $destdir      = dirname($dest);
-        
+
         if (!OC_FILESYSTEM::file_exists($destdir) || !OC_FILESYSTEM::is_dir($destdir)) {
             return "409 Conflict";
         }
             if ($options["overwrite"]) {
                 $stat = $this->DELETE(array("path" => $options["dest"]));
                 if (($stat{0} != "2") && (substr($stat, 0, 3) != "404")) {
-                    return $stat; 
+                    return $stat;
                 }
             } else {
                 return "412 precondition failed";
             }
             $destpath = $this->_unslashify($options["dest"]);
             if (is_dir($source)) {
-                    $query = "UPDATE properties 
-                                 SET path = REPLACE(path, '".$options["path"]."', '".$destpath."') 
+                    $query = "UPDATE properties
+                                 SET path = REPLACE(path, '".$options["path"]."', '".$destpath."')
                                WHERE path LIKE '".$this->_slashify($options["path"])."%'";
                     OC_DB::query($query);
             }
 
-                $query = "UPDATE properties 
+                $query = "UPDATE properties
                              SET path = '".$destpath."'
                            WHERE path = '".$options["path"]."'";
                 OC_DB::query($query);
             if (!is_array($files) || empty($files)) {
                 return "500 Internal server error";
             }
-                    
-                
+
+
             foreach ($files as $file) {
                 if (OC_FILESYSTEM::is_dir($file)) {
                     $file = $this->_slashify($file);
                 }
 
                 $destfile = str_replace($source, $dest, $file);
-                    
+
                 if (OC_FILESYSTEM::is_dir($file)) {
                     if (!OC_FILESYSTEM::file_exists($destfile)) {
                         if (!OC_FILESYSTEM::is_writeable(dirname($destfile))) {
                         return "409 Conflict";
                     }
                 } else {
-                    
+
                     if (!OC_FILESYSTEM::copy($file, $destfile)) {
                                                error_log("copy $file to $destfile failed");
                         return "409 Conflict";
                 $query = "INSERT INTO properties SELECT * FROM properties WHERE path = '".$options['path']."'";
         }
 
-        return ($new && !$existing_col) ? "201 Created" : "204 No Content";         
+        return ($new && !$existing_col) ? "201 Created" : "204 No Content";
     }
 
     /**
      * @param  array  general parameter passing array
      * @return bool   true on success
      */
-    function PROPPATCH(&$options) 
+    function PROPPATCH(&$options)
     {
         global $prefs, $tab;
 
         $path = $options["path"];
         $dir  = dirname($path)."/";
         $base = basename($path);
-            
+
         foreach ($options["props"] as $key => $prop) {
             if ($prop["ns"] == "DAV:") {
                 $options["props"][$key]['status'] = "403 Forbidden";
                         error_log($query);
                 } else {
                         $query = "DELETE FROM properties WHERE path = '$options[path]' AND name = '$prop[name]' AND ns = '$prop[ns]'";
-                }       
+                }
                     OC_DB::query($query);
             }
         }
-                        
+
         return "";
     }
 
      * @param  array  general parameter passing array
      * @return bool   true on success
      */
-    function LOCK(&$options) 
+    function LOCK(&$options)
     {
         // get absolute fs path to requested resource
         $fspath = $options["path"];
             if (is_array($row)) {
                 $query = "UPDATE `locks` SET `expires` = '$options[timeout]', `modified` = ".time()." $where";
                 OC_DB::query($query);
-                
+
                 $options['owner'] = $row['owner'];
                 $options['scope'] = $row["exclusivelock"] ? "exclusive" : "shared";
                 $options['type']  = $row["exclusivelock"] ? "write"     : "read";
                 return false;
             }
         }
-            
+
         $query = "INSERT INTO `locks`
                         SET `token`   = '$options[locktoken]'
                           , `path`    = '$options[path]'
      * @param  array  general parameter passing array
      * @return bool   true on success
      */
-    function UNLOCK(&$options) 
+    function UNLOCK(&$options)
     {
             $query = "DELETE FROM locks
                       WHERE path = '$options[path]'
      * @param  string resource path to check for locks
      * @return bool   true on success
      */
-    function checkLock($path) 
+    function checkLock($path)
     {
         $result = false;
         $query = "SELECT *
                                  "depth"   => 0,
                                  "owner"   => $row['owner'],
                                  "token"   => $row['token'],
-                                 "created" => $row['created'],   
-                                 "modified" => $row['modified'],   
+                                 "created" => $row['created'],
+                                 "modified" => $row['modified'],
                                  "expires" => $row['expires']
                                  );
             }
      * @param  void
      * @return bool   true on success
      */
-    function create_database() 
+    function create_database()
     {
         // TODO
         return false;
index 7073d0326ad1d6da95f10bd2582fdb7daf928606..763873733b26c40ac2effa996ccccba0afc7feb0 100755 (executable)
@@ -3,24 +3,25 @@
 /**
 * ownCloud
 *
-* @author Frank Karlitschek 
-* @copyright 2010 Frank Karlitschek karlitschek@kde.org 
-* 
+* @author Frank Karlitschek
+* @copyright 2010 Frank Karlitschek karlitschek@kde.org
+*
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either 
+* License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
-* 
+*
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*  
-* You should have received a copy of the GNU Lesser General Public 
+*
+* You should have received a copy of the GNU Lesser General Public
 * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
-* 
+*
 */
 
+oc_require_once("lib_log.php");
 
 
 /**
@@ -139,6 +140,7 @@ class OC_FILES {
                        $filename=OC_FILESYSTEM::toTmpFile($filename);
                }
                ob_end_clean();
+               OC_LOG::event($_SESSION['username'],3,"$dir/$files");
                readfile($filename);
                unlink($filename);
                foreach(self::$tmpFiles as $tmpFile){
@@ -147,7 +149,7 @@ class OC_FILES {
                        }
                }
        }
-       
+
        /**
        * move a file or folder
        *
@@ -163,7 +165,7 @@ class OC_FILES {
                        return OC_FILESYSTEM::rename($sourceFile,$targetFile);
                }
        }
-       
+
        /**
        * copy a file or folder
        *
@@ -179,7 +181,7 @@ class OC_FILES {
                        return OC_FILESYSTEM::copy($sourceFile,$targetFile);
                }
        }
-       
+
        /**
        * create a new file or folder
        *
@@ -196,6 +198,7 @@ class OC_FILES {
                                $fileHandle=OC_FILESYSTEM::fopen($file, 'w');
                                if($fileHandle){
                                        fclose($fileHandle);
+                                       OC_LOG::event($_SESSION['username'],4,"$dir/$name");
                                        return true;
                                }else{
                                        return false;
@@ -203,7 +206,7 @@ class OC_FILES {
                        }
                }
        }
-       
+
        /**
        * deletes a file or folder
        *
@@ -220,7 +223,7 @@ class OC_FILES {
                        }
                }
        }
-       
+
        /**
        * try to detect the mime type of a file
        *