Merge branch 'w08_MDL-42889_m27_vir' of https://github.com/skodak/moodle
authorDamyon Wiese <damyon@moodle.com>
Tue, 25 Feb 2014 02:32:44 +0000 (10:32 +0800)
committerDamyon Wiese <damyon@moodle.com>
Tue, 25 Feb 2014 02:32:44 +0000 (10:32 +0800)
admin/handlevirus.php [deleted file]
lib/deprecatedlib.php
lib/formslib.php
lib/uploadlib.php

diff --git a/admin/handlevirus.php b/admin/handlevirus.php
deleted file mode 100644 (file)
index 36cc0e3..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-<?php
-/** This expects the output from a command like
- * clamscan -r --infected --no-summary <files> 2>&1 | php -d error_log=/path/to/log thisfile.php
- * also it's important that the output of clamscan prints the FULL PATH to each infected file, so use absolute paths for area to scan
- * also it should be run as root, or whatever the webserver runs as so that it has the right permissions in the quarantine dir etc.
- * php -d error_log=/path/to/log thisfile.php will override the default error log for php cli, which is stderr, so if you want this script to just print stuff out, use php thisfile.php instead.
- */
-
-die('TODO: MDL-19380');
-
-$fd = fopen('php://stdin','r');
-if (!$fd) {
-    exit();
-}
-
-require_once(dirname(dirname(__FILE__)).'/config.php');
-require_once($CFG->libdir.'/eventslib.php');
-require_once($CFG->dirroot.'/lib/uploadlib.php'); // contains virus handling stuff.
-
-$site = get_site();
-
-while(!feof($fd)) {
-    $entry = fgets($fd);
-    if (strlen(trim($entry)) == 0) {
-        continue;
-    }
-    if (!$file = validate_line($entry)) {
-        continue;
-    }
-    $bits = explode('/',$file);
-    $a->filename = $bits[count($bits)-1];
-
-    if (!$log = $DB->get_record("log", array("module"=>"upload", "info"=>$file, "action"=>"upload"))) {
-        $a->action = clam_handle_infected_file($file,0,false);
-        clam_replace_infected_file($file);
-        notify_admins_unknown($file,$a);
-        continue;
-    }
-    $action = clam_handle_infected_file($file,$log->userid,true);
-    clam_replace_infected_file($file);
-
-    $ctxselect = ', ' . context_helper::get_preload_record_columns_sql('ctx');
-    $ctxjoin = "LEFT JOIN {context} ctx ON (ctx.instanceid = c.id AND ctx.contextlevel = :contextlevel)";
-    $sql = "SELECT c.id, c.fullname $ctxselect FROM {course} c $ctxjoin WHERE c.id = :courseid";
-    $course = $DB->get_record_sql($sql, array('courseid' => $log->course, 'contextlevel' => CONTEXT_COURSE));
-    context_helper::preload_from_record($course);
-
-    $user = $DB->get_record("user", array("id"=>$log->userid));
-    $subject = get_string('virusfoundsubject','moodle',format_string($site->fullname));
-    $a->date = userdate($log->time);
-
-    $a->action = $action;
-    $a->course = format_string($course->fullname, true, array('context' => context_course::instance($course->id)));
-    $a->user = fullname($user);
-
-    notify_user($user,$subject,$a);
-    notify_admins($user,$subject,$a);
-}
-fclose($fd);
-
-
-function notify_user($user,$subject,$a) {
-
-    if (!$user) {
-        return false;
-    }
-    $body = get_string('virusfoundlater','moodle',$a);
-
-    $eventdata = new stdClass();
-    $eventdata->modulename        = 'moodle';
-    $eventdata->userfrom          = get_admin();
-    $eventdata->userto            = $user;
-    $eventdata->subject           = $subject;
-    $eventdata->fullmessage       = $body;
-    $eventdata->fullmessageformat = FORMAT_PLAIN;
-    $eventdata->fullmessagehtml   = '';
-    $eventdata->smallmessage      = '';
-    message_send($eventdata);
-}
-
-
-function notify_admins($user,$subject,$a) {
-
-    $admins = get_admins();
-
-    $body = get_string('virusfoundlateradmin','moodle',$a);
-    foreach ($admins as $admin) {
-        $eventdata = new stdClass();
-        $eventdata->modulename        = 'moodle';
-        $eventdata->userfrom          = get_admin();
-        $eventdata->userto            = $admin;
-        $eventdata->subject           = $subject;
-        $eventdata->fullmessage       = $body;
-        $eventdata->fullmessageformat = FORMAT_PLAIN;
-        $eventdata->fullmessagehtml   = '';
-        $eventdata->smallmessage      = '';
-        message_send($eventdata);
-    }
-}
-
-function notify_admins_unknown($file,$a) {
-
-    global $site;
-
-    $admins = get_admins();
-    $subject = get_string('virusfoundsubject','moodle',format_string($site->fullname));
-    $body = get_string('virusfoundlateradminnolog','moodle',$a);
-    foreach ($admins as $admin) {
-        $eventdata = new stdClass();
-        $eventdata->modulename        = 'moodle';
-        $eventdata->userfrom          = get_admin();
-        $eventdata->userto            = $admin;
-        $eventdata->subject           = $subject;
-        $eventdata->fullmessage       = $body;
-        $eventdata->fullmessageformat = FORMAT_PLAIN;
-        $eventdata->fullmessagehtml   = '';
-        $eventdata->smallmessage      = '';
-        message_send($eventdata);
-    }
-}
-
-function validate_line($line) {
-    global $CFG;
-    if (strpos($line,"FOUND") === false) {
-        return false;
-    }
-    $index = strpos($line,":");
-    $file = substr($line,0,$index);
-    if (!(strpos($file,$CFG->dataroot) === false)) {
-        if (!file_exists($file)) {
-            return false;
-        }
-    }
-    else {
-        if ($file{0} == "/") {
-            $file = $CFG->dataroot.$file;
-        }
-        else {
-            $file = $CFG->dataroot."/".$file;
-        }
-        if (!file_exists($file)) {
-            return false;
-        }
-    }
-    // clean up
-    $file = preg_replace('/\.\//','/',$file);
-    $file = preg_replace('/\/\//','/',$file);
-    return $file;
-}
-
-
index 8090bd6..7368dc8 100644 (file)
 
 defined('MOODLE_INTERNAL') || die();
 
+/**
+ * Adds a file upload to the log table so that clam can resolve the filename to the user later if necessary
+ *
+ * @deprecated since 2.7 - use new file picker instead
+ *
+ * @param string $newfilepath
+ * @param stdClass $course
+ * @param bool $nourl
+ */
+function clam_log_upload($newfilepath, $course=null, $nourl=false) {
+    debugging('clam_log_upload() is not supposed to be used any more, use new file picker instead', DEBUG_DEVELOPER);
+}
+
+/**
+ * This function logs to error_log and to the log table that an infected file has been found and what's happened to it.
+ *
+ * @deprecated since 2.7 - use new file picker instead
+ *
+ * @param string $oldfilepath
+ * @param string $newfilepath
+ * @param int $userid The user
+ */
+function clam_log_infected($oldfilepath='', $newfilepath='', $userid=0) {
+    debugging('clam_log_infected() is not supposed to be used any more, use new file picker instead', DEBUG_DEVELOPER);
+}
+
+/**
+ * Some of the modules allow moving attachments (glossary), in which case we need to hunt down an original log and change the path.
+ *
+ * @deprecated since 2.7 - use new file picker instead
+ *
+ * @param string $oldpath
+ * @param string $newpath
+ * @param boolean $update
+ */
+function clam_change_log($oldpath, $newpath, $update=true) {
+    debugging('clam_change_log() is not supposed to be used any more, use new file picker instead', DEBUG_DEVELOPER);
+}
+
+/**
+ * Replaces the given file with a string.
+ *
+ * @deprecated since 2.7 - infected files are now deleted in file picker
+ *
+ * @param string $file
+ * @return boolean
+ */
+function clam_replace_infected_file($file) {
+    debugging('clam_change_log() is not supposed to be used any more', DEBUG_DEVELOPER);
+    return false;
+}
+
 /**
  * Checks whether the password compatibility library will work with the current
  * version of PHP. This cannot be done using PHP version numbers since the fix
index f75a75c..fa4294d 100644 (file)
@@ -345,16 +345,8 @@ abstract class moodleform {
                 continue;
             }
 
-/*
-  // TODO: rethink the file scanning MDL-19380
-            if ($CFG->runclamonupload) {
-                if (!clam_scan_moodle_file($_FILES[$elname], $COURSE)) {
-                    $errors[$elname] = $_FILES[$elname]['uploadlog'];
-                    unset($_FILES[$elname]);
-                    continue;
-                }
-            }
-*/
+            // NOTE: the viruses are scanned in file picker, no need to deal with them here.
+
             $filename = clean_param($_FILES[$elname]['name'], PARAM_FILE);
             if ($filename === '') {
                 // TODO: improve error message - wrong chars
index f6bc851..7e6e207 100644 (file)
@@ -29,6 +29,8 @@ defined('MOODLE_INTERNAL') || die();
 /**
  * This class handles all aspects of fileuploading
  *
+ * @deprecated since 2.7 - use new file pickers instead
+ *
  * @package   moodlecore
  * @copyright 1999 onwards Martin Dougiamas  {@link http://moodle.com}
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
@@ -86,10 +88,11 @@ class upload_manager {
      * @param boolean $allownull Whether we care if there's no file when we've set the input name.
      * @param boolean $allownullmultiple Whether we care if there's no files AT ALL  when we've got multiples. This won't complain if we have file 1 and file 3 but not file 2, only for NO FILES AT ALL.
      */
-    function upload_manager($inputname='', $deleteothers=false, $handlecollisions=false, $course=null, $recoverifmultiple=false, $modbytes=0, $silent=false, $allownull=false, $allownullmultiple=true) {
-
+    function __construct($inputname='', $deleteothers=false, $handlecollisions=false, $course=null, $recoverifmultiple=false, $modbytes=0, $silent=false, $allownull=false, $allownullmultiple=true) {
         global $CFG, $SITE;
 
+        debugging('upload_manager class is deprecated, use new file picker instead', DEBUG_DEVELOPER);
+
         if (empty($course->id)) {
             $course = $SITE;
         }
@@ -233,7 +236,7 @@ class upload_manager {
                 $destination = substr($destination, 0, -1);
             }
 
-            if (!make_upload_directory($destination, true)) { //TODO maybe put this function here instead of moodlelib.php now.
+            if (!make_upload_directory($destination, true)) {
                 $this->status = false;
                 return false;
             }
@@ -258,8 +261,6 @@ class upload_manager {
                     $this->files[$i]['uploadlog'] .= "\n".get_string('uploadedfile');
                     $this->files[$i]['saved'] = true;
                     $exceptions[] = $this->files[$i]['name'];
-                    // now add it to the log (this is important so we know who to notify if a virus is found later on)
-                    clam_log_upload($this->files[$i]['fullpath'], $this->course);
                     $savedsomething=true;
                 }
             }
@@ -384,7 +385,6 @@ class upload_manager {
      *
      * @param object $file Passed in by reference. The current file from $files we're processing.
      * @return string
-     * @todo Finish documenting this function
      */
     function get_file_upload_error(&$file) {
 
@@ -511,25 +511,27 @@ UPLOAD_PRINT_FORM_FRAGMENT DOESN'T REALLY BELONG IN THE CLASS BUT CERTAINLY IN T
  *
  * If moving it fails, it deletes it.
  *
- * @global object
- * @global object
+ * @deprecated since 2.7 - to be removed together with the upload_manager above
+ *
  * @param string $file Full path to the file
  * @param int $userid If not used, defaults to $USER->id (there in case called from cron)
  * @param boolean $basiconly Admin level reporting or user level reporting.
  * @return string Details of what the function did.
  */
 function clam_handle_infected_file($file, $userid=0, $basiconly=false) {
-
     global $CFG, $USER;
+
+    debugging('clam_handle_infected_file() is not supposed to be used, the files are now scanned in file picker', DEBUG_DEVELOPER);
+
     if ($USER && !$userid) {
         $userid = $USER->id;
     }
     $delete = true;
+    $notice = '';
     if (file_exists($CFG->quarantinedir) && is_dir($CFG->quarantinedir) && is_writable($CFG->quarantinedir)) {
         $now = date('YmdHis');
         if (rename($file, $CFG->quarantinedir .'/'. $now .'-user-'. $userid .'-infected')) {
             $delete = false;
-            clam_log_infected($file, $CFG->quarantinedir.'/'. $now .'-user-'. $userid .'-infected', $userid);
             if ($basiconly) {
                 $notice .= "\n". get_string('clammovedfilebasic');
             }
@@ -556,7 +558,6 @@ function clam_handle_infected_file($file, $userid=0, $basiconly=false) {
     }
     if ($delete) {
         if (unlink($file)) {
-            clam_log_infected($file, '', $userid);
             $notice .= "\n". get_string('clamdeletedfile');
         }
         else {
@@ -572,44 +573,20 @@ function clam_handle_infected_file($file, $userid=0, $basiconly=false) {
     return $notice;
 }
 
-/**
- * Replaces the given file with a string.
- *
- * The replacement string is used to notify that the original file had a virus
- * This is to avoid missing files but could result in the wrong content-type.
- *
- * @param string $file Full path to the file.
- * @return boolean
- */
-function clam_replace_infected_file($file) {
-    global $CFG;
-
-    $newcontents = get_string('virusplaceholder');
-    if (!$f = fopen($file, 'w')) {
-        return false;
-    }
-    if (!fwrite($f, $newcontents)) {
-        return false;
-    }
-    @chmod($file, $CFG->filepermissions);
-    return true;
-}
-
-
 /**
  * If $CFG->runclamonupload is set, we scan a given file. (called from {@link preprocess_files()})
  *
- * This function will add on a uploadlog index in $file.
+ * @deprecated since 2.7 - to be removed together with the upload_manager above
  *
- * @global object
- * @global object
  * @param mixed $file The file to scan from $files. or an absolute path to a file.
- * @param course $course {@link $COURSE}
+ * @param stdClass $course
  * @return int 1 if good, 0 if something goes wrong (opposite from actual error code from clam)
  */
 function clam_scan_moodle_file(&$file, $course) {
     global $CFG, $USER;
 
+    debugging('clam_scan_moodle_file() is not supposed to be used, the files are now scanned in file picker', DEBUG_DEVELOPER);
+
     if (is_array($file) && is_uploaded_file($file['tmp_name'])) { // it's from $_FILES
         $appendlog = true;
         $fullpath = $file['tmp_name'];
@@ -671,7 +648,7 @@ function clam_scan_moodle_file(&$file, $course) {
         return false; // in this case, 0 means bad.
     default:
         // error - clam failed to run or something went wrong
-        $notice .= get_string('clamfailed', 'moodle', get_clam_error_code($return));
+        $notice = get_string('clamfailed', 'moodle', get_clam_error_code($return));
         $notice .= "\n\n". implode("\n", $output);
         $newreturn = true;
         if ($CFG->clamfailureonupload == 'actlikevirus') {
@@ -713,12 +690,11 @@ function clam_message_admins($notice) {
     }
 }
 
-
 /**
  * Returns the string equivalent of a numeric clam error code
  *
  * @param int $returncode The numeric error code in question.
- * return string The definition of the error code
+ * @return string The definition of the error code
  */
 function get_clam_error_code($returncode) {
     $returncodes = array();
@@ -745,77 +721,4 @@ function get_clam_error_code($returncode) {
     if ($returncodes[$returncode])
        return $returncodes[$returncode];
     return get_string('clamunknownerror');
-
-}
-
-/**
- * Adds a file upload to the log table so that clam can resolve the filename to the user later if necessary
- *
- * @global object
- * @global object
- * @param string $newfilepath ?
- * @param course $course {@link $COURSE}
- * @param boolean $nourl ?
- * @todo Finish documenting this function
- */
-function clam_log_upload($newfilepath, $course=null, $nourl=false) {
-    global $CFG, $USER;
-    // get rid of any double // that might have appeared
-    $newfilepath = preg_replace('/\/\//', '/', $newfilepath);
-    if (strpos($newfilepath, $CFG->dataroot) === false) {
-        $newfilepath = $CFG->dataroot .'/'. $newfilepath;
-    }
-    $courseid = 0;
-    if ($course) {
-        $courseid = $course->id;
-    }
-    add_to_log($courseid, 'upload', 'upload', ((!$nourl) ? substr($_SERVER['HTTP_REFERER'], 0, 100) : ''), $newfilepath);
-}
-
-/**
- * This function logs to error_log and to the log table that an infected file has been found and what's happened to it.
- *
- * @global object
- * @param string $oldfilepath Full path to the infected file before it was moved.
- * @param string $newfilepath Full path to the infected file since it was moved to the quarantine directory (if the file was deleted, leave empty).
- * @param int $userid The user id of the user who uploaded the file.
- */
-function clam_log_infected($oldfilepath='', $newfilepath='', $userid=0) {
-    global $DB;
-
-    add_to_log(0, 'upload', 'infected', $_SERVER['HTTP_REFERER'], $oldfilepath, 0, $userid);
-
-    $user = $DB->get_record('user', array('id'=>$userid));
-
-    $errorstr = 'Clam AV has found a file that is infected with a virus. It was uploaded by '
-        . ((empty($user)) ? ' an unknown user ' : fullname($user))
-        . ((empty($oldfilepath)) ? '. The infected file was caught on upload ('.$oldfilepath.')'
-           : '. The original file path of the infected file was '. $oldfilepath)
-        . ((empty($newfilepath)) ? '. The file has been deleted ' : '. The file has been moved to a quarantine directory and the new path is '. $newfilepath);
-
-    error_log($errorstr);
-}
-
-
-/**
- * Some of the modules allow moving attachments (glossary), in which case we need to hunt down an original log and change the path.
- *
- * @global object
- * @param string $oldpath The old path to the file (should be in the log)
- * @param string $newpath The new path to the file
- * @param boolean $update If true this function will overwrite old record (used for forum moving etc).
- */
-function clam_change_log($oldpath, $newpath, $update=true) {
-    global $DB;
-
-    if (!$record = $DB->get_record('log', array('info'=>$oldpath, 'module'=>'upload'))) {
-        return false;
-    }
-    $record->info = $newpath;
-    if ($update) {
-        $DB->update_record('log', $record);
-    } else {
-        unset($record->id);
-        $DB->insert_record('log', $record);
-    }
 }