MDL-25335 prevent errors when invalid format specified in resource text page
[moodle.git] / mod / page / db / upgradelib.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * Folder module upgrade related helper functions
20  *
21  * @package    mod
22  * @subpackage page
23  * @copyright  2009 Petr Skoda (http://skodak.org)
24  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
27 defined('MOODLE_INTERNAL') || die;
29 /**
30  * Migrate page module data from 1.9 resource_old table to new page table
31  * @return void
32  */
33 function page_20_migrate() {
34     global $CFG, $DB;
35     require_once("$CFG->libdir/filelib.php");
36     require_once("$CFG->libdir/resourcelib.php");
37     require_once("$CFG->dirroot/course/lib.php");
39     if (!file_exists("$CFG->dirroot/mod/resource/db/upgradelib.php")) {
40         // bad luck, somebody deleted resource module
41         return;
42     }
44     require_once("$CFG->dirroot/mod/resource/db/upgradelib.php");
46     // create resource_old table and copy resource table there if needed
47     if (!resource_20_prepare_migration()) {
48         // no modules or fresh install
49         return;
50     }
52     $fs = get_file_storage();
54     if ($candidates = $DB->get_recordset('resource_old', array('type'=>'html', 'migrated'=>0))) {
55         foreach ($candidates as $candidate) {
56             page_20_migrate_candidate($candidate, $fs, FORMAT_HTML);
57         }
58         $candidates->close();
59     }
61     if ($candidates = $DB->get_recordset('resource_old', array('type'=>'text', 'migrated'=>0))) {
62         foreach ($candidates as $candidate) {
63             //there might be some rubbish instead of format int value
64             $format = (int)$candidate->reference;
65             if ($format < 0 or $format > 4) {
66                 $format = FORMAT_MOODLE;
67             }
68             page_20_migrate_candidate($candidate, $fs, $format);
69         }
70         $candidates->close();
71     }
73     // clear all course modinfo caches
74     rebuild_course_cache(0, true);
76 }
78 function page_20_migrate_candidate($candidate, $fs, $format) {
79     global $CFG, $DB;
80     upgrade_set_timeout();
82     if ($CFG->texteditors !== 'textarea') {
83         $intro       = text_to_html($candidate->intro, false, false, true);
84         $introformat = FORMAT_HTML;
85     } else {
86         $intro       = $candidate->intro;
87         $introformat = FORMAT_MOODLE;
88     }
90     $page = new stdClass();
91     $page->course        = $candidate->course;
92     $page->name          = $candidate->name;
93     $page->intro         = $intro;
94     $page->introformat   = $introformat;
95     $page->content       = $candidate->alltext;
96     $page->contentformat = $format;
97     $page->revision      = 1;
98     $page->timemodified  = time();
100     // convert links to old course files - let the automigration do the actual job
101     $usedfiles = array("$CFG->wwwroot/file.php/$page->course/", "$CFG->wwwroot/file.php?file=/$page->course/");
102     $page->content = str_ireplace($usedfiles, '@@PLUGINFILE@@/', $page->content);
103     if (strpos($page->content, '@@PLUGINFILE@@/') === false) {
104         $page->legacyfiles = RESOURCELIB_LEGACYFILES_NO;
105     } else {
106         $page->legacyfiles = RESOURCELIB_LEGACYFILES_ACTIVE;
107     }
109     $options = array('printheading'=>0, 'printintro'=>0);
110     if ($candidate->popup) {
111         $page->display = RESOURCELIB_DISPLAY_POPUP;
112         if ($candidate->popup) {
113             $rawoptions = explode(',', $candidate->popup);
114             foreach ($rawoptions as $rawoption) {
115                 list($name, $value) = explode('=', trim($rawoption), 2);
116                 if ($value > 0 and ($name == 'width' or $name == 'height')) {
117                     $options['popup'.$name] = $value;
118                     continue;
119                 }
120             }
121         }
122     } else {
123         $page->display = RESOURCELIB_DISPLAY_OPEN;
124     }
125     $page->displayoptions = serialize($options);
127     $page = resource_migrate_to_module('page', $candidate, $page);
129     // now try to migrate files from site files
130     // note: this can not work for html pages or files with other relatively linked files :-(
131     $siteid = get_site()->id;
132     if (preg_match_all("|$CFG->wwwroot/file.php(\?file=)?/$siteid(/[^\s'\"&\?#]+)|", $page->content, $matches)) {
133         $context     = get_context_instance(CONTEXT_MODULE, $candidate->cmid);
134         $sitecontext = get_context_instance(CONTEXT_COURSE, $siteid);
135         $file_record = array('contextid'=>$context->id, 'component'=>'mod_page', 'filearea'=>'content', 'itemid'=>0);
136         $fs = get_file_storage();
137         foreach ($matches[2] as $i=>$sitefile) {
138             if (!$file = $fs->get_file_by_hash(sha1("/$sitecontext->id/course/legacy/0".$sitefile))) {
139                 continue;
140             }
141             try {
142                 $fs->create_file_from_storedfile($file_record, $file);
143                 $page->content = str_replace($matches[0][$i], '@@PLUGINFILE@@'.$sitefile, $page->content);
144             } catch (Exception $x) {
145             }
146         }
147         $DB->update_record('page', $page);
148     }