Merge branch 'dev_MDL-33127_draft_storing' of git://github.com/dongsheng/moodle
authorDan Poltawski <dan@moodle.com>
Thu, 24 May 2012 08:34:32 +0000 (16:34 +0800)
committerDan Poltawski <dan@moodle.com>
Thu, 24 May 2012 08:34:32 +0000 (16:34 +0800)
1  2 
lib/filelib.php

diff --combined lib/filelib.php
@@@ -732,8 -732,8 +732,8 @@@ function file_save_draft_area_files($dr
      } else if (count($oldfiles) < 2) {
          $filecount = 0;
          // there were no files before - one file means root dir only ;-)
-         $file_record = array('contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid);
          foreach ($draftfiles as $file) {
+             $file_record = array('contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid);
              if (!$options['subdirs']) {
                  if ($file->get_filepath() !== '/' or $file->is_directory()) {
                      continue;
      } else {
          // we have to merge old and new files - we want to keep file ids for files that were not changed
          // we change time modified for all new and changed files, we keep time created as is
-         $file_record = array('contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid, 'timemodified'=>time());
  
          $newhashes = array();
          foreach ($draftfiles as $file) {
          // Add fresh file or the file which has changed status
          // the size and subdirectory tests are extra safety only, the UI should prevent it
          foreach ($newhashes as $file) {
+             $file_record = array('contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid, 'timemodified'=>time());
              if (!$options['subdirs']) {
                  if ($file->get_filepath() !== '/' or $file->is_directory()) {
                      continue;
@@@ -1367,7 -1367,7 +1367,7 @@@ function &get_mimetypes_array() 
          'asc'  => array ('type'=>'text/plain', 'icon'=>'text'),
          'asm'  => array ('type'=>'text/plain', 'icon'=>'text'),
          'au'   => array ('type'=>'audio/au', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
 -        'avi'  => array ('type'=>'video/x-ms-wm', 'icon'=>'avi', 'groups'=>array('video'), 'string'=>'video'),
 +        'avi'  => array ('type'=>'video/x-ms-wm', 'icon'=>'avi', 'groups'=>array('video','web_video'), 'string'=>'video'),
          'bmp'  => array ('type'=>'image/bmp', 'icon'=>'bmp', 'groups'=>array('image'), 'string'=>'image'),
          'c'    => array ('type'=>'text/plain', 'icon'=>'text'),
          'cct'  => array ('type'=>'shockwave/director', 'icon'=>'flash'),
          'dotm' => array ('type'=>'application/vnd.ms-word.template.macroEnabled.12', 'icon'=>'docx'),
  
          'dcr'  => array ('type'=>'application/x-director', 'icon'=>'flash'),
 -        'dif'  => array ('type'=>'video/x-dv', 'icon'=>'video', 'groups'=>array('mov'), 'string'=>'video'),
 +        'dif'  => array ('type'=>'video/x-dv', 'icon'=>'mov', 'groups'=>array('video'), 'string'=>'video'),
          'dir'  => array ('type'=>'application/x-director', 'icon'=>'flash'),
          'dxr'  => array ('type'=>'application/x-director', 'icon'=>'flash'),
          'eps'  => array ('type'=>'application/postscript', 'icon'=>'eps'),
          'fdf'  => array ('type'=>'application/pdf', 'icon'=>'pdf'),
 -        'flv'  => array ('type'=>'video/x-flv', 'icon'=>'flash', 'groups'=>array('video'), 'string'=>'video'),
 -        'f4v'  => array ('type'=>'video/mp4', 'icon'=>'flash', 'groups'=>array('video'), 'string'=>'video'),
 +        'flv'  => array ('type'=>'video/x-flv', 'icon'=>'flash', 'groups'=>array('video','web_video'), 'string'=>'video'),
 +        'f4v'  => array ('type'=>'video/mp4', 'icon'=>'flash', 'groups'=>array('video','web_video'), 'string'=>'video'),
          'gif'  => array ('type'=>'image/gif', 'icon'=>'gif', 'groups'=>array('image', 'web_image'), 'string'=>'image'),
          'gtar' => array ('type'=>'application/x-gtar', 'icon'=>'zip', 'groups'=>array('archive'), 'string'=>'archive'),
          'tgz'  => array ('type'=>'application/g-zip', 'icon'=>'zip', 'groups'=>array('archive'), 'string'=>'archive'),
          'hqx'  => array ('type'=>'application/mac-binhex40', 'icon'=>'zip', 'groups'=>array('archive'), 'string'=>'archive'),
          'htc'  => array ('type'=>'text/x-component', 'icon'=>'html'),
          'html' => array ('type'=>'text/html', 'icon'=>'html', 'groups'=>array('web_file')),
 -        'xhtml'=> array ('type'=>'application/xhtml+xml', 'icon'=>'html'),
 +        'xhtml'=> array ('type'=>'application/xhtml+xml', 'icon'=>'html', 'groups'=>array('web_file')),
          'htm'  => array ('type'=>'text/html', 'icon'=>'html', 'groups'=>array('web_file')),
          'ico'  => array ('type'=>'image/vnd.microsoft.icon', 'icon'=>'image', 'groups'=>array('image'), 'string'=>'image'),
          'ics'  => array ('type'=>'text/calendar', 'icon'=>'text'),
          'isf'  => array ('type'=>'application/inspiration', 'icon'=>'isf'),
          'ist'  => array ('type'=>'application/inspiration.template', 'icon'=>'isf'),
          'java' => array ('type'=>'text/plain', 'icon'=>'text'),
 -        'jcb'  => array ('type'=>'text/xml', 'icon'=>'text'),
 -        'jcl'  => array ('type'=>'text/xml', 'icon'=>'text'),
 -        'jcw'  => array ('type'=>'text/xml', 'icon'=>'text'),
 -        'jmt'  => array ('type'=>'text/xml', 'icon'=>'text'),
 -        'jmx'  => array ('type'=>'text/xml', 'icon'=>'text'),
 +        'jcb'  => array ('type'=>'text/xml', 'icon'=>'xml'),
 +        'jcl'  => array ('type'=>'text/xml', 'icon'=>'xml'),
 +        'jcw'  => array ('type'=>'text/xml', 'icon'=>'xml'),
 +        'jmt'  => array ('type'=>'text/xml', 'icon'=>'xml'),
 +        'jmx'  => array ('type'=>'text/xml', 'icon'=>'xml'),
          'jpe'  => array ('type'=>'image/jpeg', 'icon'=>'jpeg', 'groups'=>array('image', 'web_image'), 'string'=>'image'),
          'jpeg' => array ('type'=>'image/jpeg', 'icon'=>'jpeg', 'groups'=>array('image', 'web_image'), 'string'=>'image'),
          'jpg'  => array ('type'=>'image/jpeg', 'icon'=>'jpeg', 'groups'=>array('image', 'web_image'), 'string'=>'image'),
          'latex'=> array ('type'=>'application/x-latex', 'icon'=>'text'),
          'm'    => array ('type'=>'text/plain', 'icon'=>'text'),
          'mbz'  => array ('type'=>'application/vnd.moodle.backup', 'icon'=>'moodle'),
 -        'mov'  => array ('type'=>'video/quicktime', 'icon'=>'mov', 'groups'=>array('video'), 'string'=>'video'),
 +        'mov'  => array ('type'=>'video/quicktime', 'icon'=>'mov', 'groups'=>array('video','web_video'), 'string'=>'video'),
          'movie'=> array ('type'=>'video/x-sgi-movie', 'icon'=>'mov', 'groups'=>array('video'), 'string'=>'video'),
          'm3u'  => array ('type'=>'audio/x-mpegurl', 'icon'=>'mp3', 'groups'=>array('audio'), 'string'=>'audio'),
 -        'mp3'  => array ('type'=>'audio/mp3', 'icon'=>'mp3', 'groups'=>array('audio'), 'string'=>'audio'),
 -        'mp4'  => array ('type'=>'video/mp4', 'icon'=>'mpeg', 'groups'=>array('video'), 'string'=>'video'),
 -        'm4v'  => array ('type'=>'video/mp4', 'icon'=>'mpeg', 'groups'=>array('video'), 'string'=>'video'),
 +        'mp3'  => array ('type'=>'audio/mp3', 'icon'=>'mp3', 'groups'=>array('audio','web_audio'), 'string'=>'audio'),
 +        'mp4'  => array ('type'=>'video/mp4', 'icon'=>'mpeg', 'groups'=>array('video','web_video'), 'string'=>'video'),
 +        'm4v'  => array ('type'=>'video/mp4', 'icon'=>'mpeg', 'groups'=>array('video','web_video'), 'string'=>'video'),
          'm4a'  => array ('type'=>'audio/mp4', 'icon'=>'mp3', 'groups'=>array('audio'), 'string'=>'audio'),
 -        'mpeg' => array ('type'=>'video/mpeg', 'icon'=>'mpeg', 'groups'=>array('video'), 'string'=>'video'),
 -        'mpe'  => array ('type'=>'video/mpeg', 'icon'=>'mpeg', 'groups'=>array('video'), 'string'=>'video'),
 -        'mpg'  => array ('type'=>'video/mpeg', 'icon'=>'mpeg', 'groups'=>array('video'), 'string'=>'video'),
 -
 -        'odt'  => array ('type'=>'application/vnd.oasis.opendocument.text', 'icon'=>'odt', 'groups'=>array('odt')),
 -        'ott'  => array ('type'=>'application/vnd.oasis.opendocument.text-template', 'icon'=>'odt', 'groups'=>array('odt')),
 -        'oth'  => array ('type'=>'application/vnd.oasis.opendocument.text-web', 'icon'=>'odt', 'groups'=>array('odh')),
 -        'odm'  => array ('type'=>'application/vnd.oasis.opendocument.text-master', 'icon'=>'odh'),
 +        'mpeg' => array ('type'=>'video/mpeg', 'icon'=>'mpeg', 'groups'=>array('video','web_video'), 'string'=>'video'),
 +        'mpe'  => array ('type'=>'video/mpeg', 'icon'=>'mpeg', 'groups'=>array('video','web_video'), 'string'=>'video'),
 +        'mpg'  => array ('type'=>'video/mpeg', 'icon'=>'mpeg', 'groups'=>array('video','web_video'), 'string'=>'video'),
 +
 +        'odt'  => array ('type'=>'application/vnd.oasis.opendocument.text', 'icon'=>'odt', 'groups'=>array('document')),
 +        'ott'  => array ('type'=>'application/vnd.oasis.opendocument.text-template', 'icon'=>'odt', 'groups'=>array('document')),
 +        'oth'  => array ('type'=>'application/vnd.oasis.opendocument.text-web', 'icon'=>'oth', 'groups'=>array('document')),
 +        'odm'  => array ('type'=>'application/vnd.oasis.opendocument.text-master', 'icon'=>'odt'),
          'odg'  => array ('type'=>'application/vnd.oasis.opendocument.graphics', 'icon'=>'odg'),
          'otg'  => array ('type'=>'application/vnd.oasis.opendocument.graphics-template', 'icon'=>'odg'),
          'odp'  => array ('type'=>'application/vnd.oasis.opendocument.presentation', 'icon'=>'odp'),
          'ppsm' => array ('type'=>'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', 'icon'=>'pptx'),
  
          'ps'   => array ('type'=>'application/postscript', 'icon'=>'pdf'),
 -        'qt'   => array ('type'=>'video/quicktime', 'icon'=>'mov', 'groups'=>array('video'), 'string'=>'video'),
 -        'ra'   => array ('type'=>'audio/x-realaudio-plugin', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
 +        'qt'   => array ('type'=>'video/quicktime', 'icon'=>'mov', 'groups'=>array('video','web_video'), 'string'=>'video'),
 +        'ra'   => array ('type'=>'audio/x-realaudio-plugin', 'icon'=>'audio', 'groups'=>array('audio','web_audio'), 'string'=>'audio'),
          'ram'  => array ('type'=>'audio/x-pn-realaudio-plugin', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
          'rhb'  => array ('type'=>'text/xml', 'icon'=>'xml'),
          'rm'   => array ('type'=>'audio/x-pn-realaudio-plugin', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'),
          'smi'  => array ('type'=>'application/smil', 'icon'=>'text'),
          'smil' => array ('type'=>'application/smil', 'icon'=>'text'),
          'sqt'  => array ('type'=>'text/xml', 'icon'=>'xml'),
 -        'svg'  => array ('type'=>'image/svg+xml', 'icon'=>'image', 'groups'=>array('image'), 'string'=>'image'),
 -        'svgz' => array ('type'=>'image/svg+xml', 'icon'=>'image', 'groups'=>array('image'), 'string'=>'image'),
 +        'svg'  => array ('type'=>'image/svg+xml', 'icon'=>'image', 'groups'=>array('image','web_image'), 'string'=>'image'),
 +        'svgz' => array ('type'=>'image/svg+xml', 'icon'=>'image', 'groups'=>array('image','web_image'), 'string'=>'image'),
          'swa'  => array ('type'=>'application/x-director', 'icon'=>'flash'),
 -        'swf'  => array ('type'=>'application/x-shockwave-flash', 'icon'=>'flash'),
 -        'swfl' => array ('type'=>'application/x-shockwave-flash', 'icon'=>'flash'),
 +        'swf'  => array ('type'=>'application/x-shockwave-flash', 'icon'=>'flash', 'groups'=>array('video','web_video')),
 +        'swfl' => array ('type'=>'application/x-shockwave-flash', 'icon'=>'flash', 'groups'=>array('video','web_video')),
  
          'sxw'  => array ('type'=>'application/vnd.sun.xml.writer', 'icon'=>'odt'),
          'stw'  => array ('type'=>'application/vnd.sun.xml.writer.template', 'icon'=>'odt'),
@@@ -1595,22 -1595,22 +1595,22 @@@ function mimeinfo_from_type($element, $
          foreach($mimeinfo as $filetype => $values) {
              if ($values['type'] == $mimetype) {
                  if ($cached[$mimetype] === null) {
 -                    $cached[$mimetype] = $filetype;
 +                    $cached[$mimetype] = '.'.$filetype;
                  }
                  if (!empty($values['defaulticon'])) {
 -                    $cached[$mimetype] = $filetype;
 +                    $cached[$mimetype] = '.'.$filetype;
                      break;
                  }
              }
          }
          if (empty($cached[$mimetype])) {
 -            $cached[$mimetype] = 'xxx';
 +            $cached[$mimetype] = '.xxx';
          }
      }
      if ($element === 'extension') {
          return $cached[$mimetype];
      } else {
 -        return mimeinfo($element, '.'.$cached[$mimetype]);
 +        return mimeinfo($element, $cached[$mimetype]);
      }
  }
  
@@@ -1653,15 -1653,14 +1653,15 @@@ function file_file_icon($file, $size = 
      } else {
          $mimetype = '';
      }
 -    if ($filename && pathinfo($filename, PATHINFO_EXTENSION) &&
 -            (!$mimetype || mimeinfo('type', $filename) === $mimetype)) {
 -        // files with different extensions sharing the same mimetype (i.e. 'text/plain') may have different icons
 -        return file_extension_icon($filename, $size);
 -    } else {
 -        // if mimetype and extension do not match we assume that mimetype is more correct
 -        return file_mimetype_icon($mimetype, $size);
 +    $mimetypes = &get_mimetypes_array();
 +    if ($filename) {
 +        $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
 +        if ($extension && !empty($mimetypes[$extension])) {
 +            // if file name has known extension, return icon for this extension
 +            return file_extension_icon($filename, $size);
 +        }
      }
 +    return file_mimetype_icon($mimetype, $size);
  }
  
  /**
  function file_folder_icon($iconsize = null) {
      global $CFG;
      static $iconpostfixes = array(256=>'-256', 128=>'-128', 96=>'-96', 80=>'-80', 72=>'-72', 64=>'-64', 48=>'-48', 32=>'-32', 24=>'-24', 16=>'');
 +    static $cached = array();
      $iconsize = max(array(16, (int)$iconsize));
 -    foreach ($iconpostfixes as $size => $postfix) {
 -        $fullname = $CFG->dirroot.'/pix/f/folder'.$postfix;
 -        if ($iconsize >= $size && (file_exists($fullname.'.png') || file_exists($fullname.'.gif'))) {
 -            return 'f/folder'.$postfix;
 +    if (!array_key_exists($iconsize, $cached)) {
 +        foreach ($iconpostfixes as $size => $postfix) {
 +            $fullname = $CFG->dirroot.'/pix/f/folder'.$postfix;
 +            if ($iconsize >= $size && (file_exists($fullname.'.png') || file_exists($fullname.'.gif'))) {
 +                $cached[$iconsize] = 'f/folder'.$postfix;
 +                break;
 +            }
          }
      }
 +    return $cached[$iconsize];
  }
  
  /**
@@@ -1755,7 -1749,6 +1755,7 @@@ function file_extension_icon($filename
   * @return string Text description
   */
  function get_mimetype_description($obj, $capitalise=false) {
 +    $filename = $mimetype = '';
      if (is_object($obj) && method_exists($obj, 'get_filename') && method_exists($obj, 'get_mimetype')) {
          // this is an instance of stored_file
          $mimetype = $obj->get_mimetype();
          $obj = (array)$obj;
          if (!empty($obj['filename'])) {
              $filename = $obj['filename'];
 -        } else {
 -            $filename = '';
          }
          if (!empty($obj['mimetype'])) {
              $mimetype = $obj['mimetype'];
 -        } else {
 -            $mimetype = mimeinfo('type', $filename);
          }
      } else {
          $mimetype = $obj;
 -        $filename = '';
 +    }
 +    $mimetypefromext = mimeinfo('type', $filename);
 +    if (empty($mimetype) || $mimetypefromext !== 'document/unknown') {
 +        // if file has a known extension, overwrite the specified mimetype
 +        $mimetype = $mimetypefromext;
      }
      $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
      if (empty($extension)) {
          $mimetypestr = mimeinfo_from_type('string', $mimetype);
 -        $extension = mimeinfo_from_type('extension', $mimetype);
 +        $extension = str_replace('.', '', mimeinfo_from_type('extension', $mimetype));
      } else {
          $mimetypestr = mimeinfo('string', $filename);
      }
@@@ -1838,11 -1831,11 +1838,11 @@@ function file_get_typegroup($element, $
              $mimeinfo = & get_mimetypes_array();
              $cached[$element][$group] = array();
              foreach ($mimeinfo as $extension => $value) {
 -                $value['extension'] = $extension;
 +                $value['extension'] = '.'.$extension;
                  if (empty($value[$element])) {
                      continue;
                  }
 -                if (($group === $extension || $group === $value['type'] ||
 +                if (($group === '.'.$extension || $group === $value['type'] ||
                          (!empty($value['groups']) && in_array($group, $value['groups']))) &&
                          !in_array($value[$element], $cached[$element][$group])) {
                      $cached[$element][$group][] = $value[$element];
   */
  function file_extension_in_typegroup($filename, $groups, $checktype = false) {
      $extension = pathinfo($filename, PATHINFO_EXTENSION);
 -    if (!empty($extension) && in_array(strtolower($extension), file_get_typegroup('extension', $groups))) {
 +    if (!empty($extension) && in_array('.'.strtolower($extension), file_get_typegroup('extension', $groups))) {
          return true;
      }
      return $checktype && file_mimetype_in_typegroup(mimeinfo('type', $filename), $groups);
@@@ -4087,12 -4080,6 +4087,12 @@@ function file_pluginfile($relativepath
                  // somebody tries to gain illegal access, cm type must match the component!
                  send_file_not_found();
              }
 +
 +            $bprecord = $DB->get_record('block_positions', array('blockinstanceid' => $context->instanceid), 'visible');
 +            // User can't access file, if block is hidden or doesn't have block:view capability
 +            if (($bprecord && !$bprecord->visible) || !has_capability('moodle/block:view', $context)) {
 +                 send_file_not_found();
 +            }
          } else {
              $birecord = null;
          }