MDL-42889 cleanup obsolete clam relatd code
authorPetr Škoda <commits@skodak.org>
Tue, 18 Feb 2014 01:22:30 +0000 (09:22 +0800)
committerPetr Škoda <commits@skodak.org>
Tue, 18 Feb 2014 01:22:30 +0000 (09:22 +0800)
Since 2.0 all uploaded files need to go through the file picker which does the scanning,
the idea is that it is more important to warn users that their computer is crawling
with viruses. All teachers are supposed to have local up-to-date antivirus software!

Since 2.0 we are not scanning existing files on server, in future we might use the
status flag in files table to indicate the file is problematic, but still we should
never detele anthing from the filedir...

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 a24e8ee..40991cb 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 5072b5f..943e722 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);
-    }
 }