Merge branch 'MD-31803' of git://github.com/mouneyrac/moodle
[moodle.git] / admin / index.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  * Main administration script.
20  *
21  * @package    core
22  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 // Check that config.php exists, if not then call the install script
27 if (!file_exists('../config.php')) {
28     header('Location: ../install.php');
29     die();
30 }
32 // Check that PHP is of a sufficient version as soon as possible
33 if (version_compare(phpversion(), '5.3.2') < 0) {
34     $phpversion = phpversion();
35     // do NOT localise - lang strings would not work here and we CAN NOT move it to later place
36     echo "Moodle 2.1 or later requires at least PHP 5.3.2 (currently using version $phpversion).<br />";
37     echo "Please upgrade your server software or install older Moodle version.";
38     die();
39 }
41 // make sure iconv is available and actually works
42 if (!function_exists('iconv')) {
43     // this should not happen, this must be very borked install
44     echo 'Moodle requires the iconv PHP extension. Please install or enable the iconv extension.';
45     die();
46 }
48 define('NO_OUTPUT_BUFFERING', true);
50 require('../config.php');
51 require_once($CFG->libdir.'/adminlib.php');    // various admin-only functions
52 require_once($CFG->libdir.'/upgradelib.php');  // general upgrade/install related functions
53 require_once($CFG->libdir.'/pluginlib.php');   // available updates notifications
55 $id             = optional_param('id', '', PARAM_TEXT);
56 $confirmupgrade = optional_param('confirmupgrade', 0, PARAM_BOOL);
57 $confirmrelease = optional_param('confirmrelease', 0, PARAM_BOOL);
58 $confirmplugins = optional_param('confirmplugincheck', 0, PARAM_BOOL);
59 $showallplugins = optional_param('showallplugins', 0, PARAM_BOOL);
60 $agreelicense   = optional_param('agreelicense', 0, PARAM_BOOL);
61 $fetchupdates   = optional_param('fetchupdates', 0, PARAM_BOOL);
63 // Check some PHP server settings
65 $PAGE->set_url('/admin/index.php');
66 $PAGE->set_pagelayout('admin'); // Set a default pagelayout
68 $documentationlink = '<a href="http://docs.moodle.org/en/Installation">Installation docs</a>';
70 if (ini_get_bool('session.auto_start')) {
71     print_error('phpvaroff', 'debug', '', (object)array('name'=>'session.auto_start', 'link'=>$documentationlink));
72 }
74 if (ini_get_bool('magic_quotes_runtime')) {
75     print_error('phpvaroff', 'debug', '', (object)array('name'=>'magic_quotes_runtime', 'link'=>$documentationlink));
76 }
78 if (!ini_get_bool('file_uploads')) {
79     print_error('phpvaron', 'debug', '', (object)array('name'=>'file_uploads', 'link'=>$documentationlink));
80 }
82 if (is_float_problem()) {
83     print_error('phpfloatproblem', 'admin', '', $documentationlink);
84 }
86 // Set some necessary variables during set-up to avoid PHP warnings later on this page
87 if (!isset($CFG->release)) {
88     $CFG->release = '';
89 }
90 if (!isset($CFG->version)) {
91     $CFG->version = '';
92 }
93 if (!isset($CFG->branch)) {
94     $CFG->branch = '';
95 }
97 $version = null;
98 $release = null;
99 $branch = null;
100 require("$CFG->dirroot/version.php");       // defines $version, $release, $branch and $maturity
101 $CFG->target_release = $release;            // used during installation and upgrades
103 if (!$version or !$release) {
104     print_error('withoutversion', 'debug'); // without version, stop
107 // Turn off xmlstrictheaders during upgrade.
108 $origxmlstrictheaders = !empty($CFG->xmlstrictheaders);
109 $CFG->xmlstrictheaders = false;
111 if (!core_tables_exist()) {
112     $PAGE->set_pagelayout('maintenance');
113     $PAGE->set_popup_notification_allowed(false);
115     // fake some settings
116     $CFG->docroot = 'http://docs.moodle.org';
118     $strinstallation = get_string('installation', 'install');
120     // remove current session content completely
121     session_get_instance()->terminate_current();
123     if (empty($agreelicense)) {
124         $strlicense = get_string('license');
126         $PAGE->navbar->add($strlicense);
127         $PAGE->set_title($strinstallation.' - Moodle '.$CFG->target_release);
128         $PAGE->set_heading($strinstallation);
129         $PAGE->set_cacheable(false);
131         $output = $PAGE->get_renderer('core', 'admin');
132         echo $output->install_licence_page();
133         die();
134     }
135     if (empty($confirmrelease)) {
136         require_once($CFG->libdir.'/environmentlib.php');
137         list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE);
138         $strcurrentrelease = get_string('currentrelease');
140         $PAGE->navbar->add($strcurrentrelease);
141         $PAGE->set_title($strinstallation);
142         $PAGE->set_heading($strinstallation . ' - Moodle ' . $CFG->target_release);
143         $PAGE->set_cacheable(false);
145         $output = $PAGE->get_renderer('core', 'admin');
146         echo $output->install_environment_page($maturity, $envstatus, $environment_results, $release);
147         die();
148     }
150     // check plugin dependencies
151     $failed = array();
152     if (!plugin_manager::instance()->all_plugins_ok($version, $failed)) {
153         $PAGE->navbar->add(get_string('pluginscheck', 'admin'));
154         $PAGE->set_title($strinstallation);
155         $PAGE->set_heading($strinstallation . ' - Moodle ' . $CFG->target_release);
157         $output = $PAGE->get_renderer('core', 'admin');
158         $url = new moodle_url('/admin/index.php', array('agreelicense' => 1, 'confirmrelease' => 1, 'lang' => $CFG->lang));
159         echo $output->unsatisfied_dependencies_page($version, $failed, $url);
160         die();
161     }
162     unset($failed);
164     //TODO: add a page with list of non-standard plugins here
166     $strdatabasesetup = get_string('databasesetup');
167     upgrade_init_javascript();
169     $PAGE->navbar->add($strdatabasesetup);
170     $PAGE->set_title($strinstallation.' - Moodle '.$CFG->target_release);
171     $PAGE->set_heading($strinstallation);
172     $PAGE->set_cacheable(false);
174     $output = $PAGE->get_renderer('core', 'admin');
175     echo $output->header();
177     if (!$DB->setup_is_unicodedb()) {
178         if (!$DB->change_db_encoding()) {
179             // If could not convert successfully, throw error, and prevent installation
180             print_error('unicoderequired', 'admin');
181         }
182     }
184     install_core($version, true);
188 // Check version of Moodle code on disk compared with database
189 // and upgrade if possible.
191 $stradministration = get_string('administration');
192 $PAGE->set_context(get_context_instance(CONTEXT_SYSTEM));
194 if (empty($CFG->version)) {
195     print_error('missingconfigversion', 'debug');
198 if ($version > $CFG->version) {  // upgrade
199     purge_all_caches();
200     $PAGE->set_pagelayout('maintenance');
201     $PAGE->set_popup_notification_allowed(false);
203     if (upgrade_stale_php_files_present()) {
204         $PAGE->set_title($stradministration);
205         $PAGE->set_cacheable(false);
207         $output = $PAGE->get_renderer('core', 'admin');
208         echo $output->upgrade_stale_php_files_page();
209         die();
210     }
212     if (empty($confirmupgrade)) {
213         $a = new stdClass();
214         $a->oldversion = "$CFG->release ($CFG->version)";
215         $a->newversion = "$release ($version)";
216         $strdatabasechecking = get_string('databasechecking', '', $a);
218         $PAGE->set_title($stradministration);
219         $PAGE->set_heading($strdatabasechecking);
220         $PAGE->set_cacheable(false);
222         $output = $PAGE->get_renderer('core', 'admin');
223         echo $output->upgrade_confirm_page($a->newversion, $maturity);
224         die();
226     } else if (empty($confirmrelease)){
227         require_once($CFG->libdir.'/environmentlib.php');
228         list($envstatus, $environment_results) = check_moodle_environment($release, ENV_SELECT_RELEASE);
229         $strcurrentrelease = get_string('currentrelease');
231         $PAGE->navbar->add($strcurrentrelease);
232         $PAGE->set_title($strcurrentrelease);
233         $PAGE->set_heading($strcurrentrelease);
234         $PAGE->set_cacheable(false);
236         $output = $PAGE->get_renderer('core', 'admin');
237         echo $output->upgrade_environment_page($release, $envstatus, $environment_results);
238         die();
240     } else if (empty($confirmplugins)) {
241         $strplugincheck = get_string('plugincheck');
243         $PAGE->navbar->add($strplugincheck);
244         $PAGE->set_title($strplugincheck);
245         $PAGE->set_heading($strplugincheck);
246         $PAGE->set_cacheable(false);
248         $reloadurl = new moodle_url('/admin/index.php', array('confirmupgrade' => 1, 'confirmrelease' => 1));
250         // check plugin dependencies first
251         $failed = array();
252         if (!plugin_manager::instance()->all_plugins_ok($version, $failed)) {
253             $output = $PAGE->get_renderer('core', 'admin');
254             echo $output->unsatisfied_dependencies_page($version, $failed, $reloadurl);
255             die();
256         }
257         unset($failed);
259         if ($fetchupdates) {
260             // no sesskey support guaranteed here
261             if (empty($CFG->disableupdatenotifications)) {
262                 available_update_checker::instance()->fetch();
263             }
264             redirect($reloadurl);
265         }
267         $output = $PAGE->get_renderer('core', 'admin');
268         echo $output->upgrade_plugin_check_page(plugin_manager::instance(), available_update_checker::instance(),
269                 $version, $showallplugins, $reloadurl,
270                 new moodle_url('/admin/index.php', array('confirmupgrade'=>1, 'confirmrelease'=>1, 'confirmplugincheck'=>1)));
271         die();
273     } else {
274         // Launch main upgrade
275         upgrade_core($version, true);
276     }
277 } else if ($version < $CFG->version) {
278     // better stop here, we can not continue with plugin upgrades or anything else
279     throw new moodle_exception('downgradedcore', 'error', new moodle_url('/admin/'));
282 // Updated human-readable release version if necessary
283 if ($release <> $CFG->release) {  // Update the release version
284     set_config('release', $release);
287 if ($branch <> $CFG->branch) {  // Update the branch
288     set_config('branch', $branch);
291 if (moodle_needs_upgrading()) {
292     if (!$PAGE->headerprinted) {
293         // means core upgrade or installation was not already done
294         if (!$confirmplugins) {
295             $strplugincheck = get_string('plugincheck');
297             $PAGE->set_pagelayout('maintenance');
298             $PAGE->set_popup_notification_allowed(false);
299             $PAGE->navbar->add($strplugincheck);
300             $PAGE->set_title($strplugincheck);
301             $PAGE->set_heading($strplugincheck);
302             $PAGE->set_cacheable(false);
304             if ($fetchupdates) {
305                 // no sesskey support guaranteed here
306                 available_update_checker::instance()->fetch();
307                 redirect($PAGE->url);
308             }
310             $output = $PAGE->get_renderer('core', 'admin');
312             // check plugin dependencies first
313             $failed = array();
314             if (!plugin_manager::instance()->all_plugins_ok($version, $failed)) {
315                 echo $output->unsatisfied_dependencies_page($version, $failed, $PAGE->url);
316                 die();
317             }
318             unset($failed);
320             // dependencies check passed, let's rock!
321             echo $output->upgrade_plugin_check_page(plugin_manager::instance(), available_update_checker::instance(),
322                     $version, $showallplugins,
323                     new moodle_url($PAGE->url),
324                     new moodle_url('/admin/index.php', array('confirmplugincheck'=>1)));
325             die();
326         }
327     }
328     // install/upgrade all plugins and other parts
329     upgrade_noncore(true);
332 // If this is the first install, indicate that this site is fully configured
333 // except the admin password
334 if (during_initial_install()) {
335     set_config('rolesactive', 1); // after this, during_initial_install will return false.
336     set_config('adminsetuppending', 1);
337     // we need this redirect to setup proper session
338     upgrade_finished("index.php?sessionstarted=1&amp;lang=$CFG->lang");
341 // make sure admin user is created - this is the last step because we need
342 // session to be working properly in order to edit admin account
343  if (!empty($CFG->adminsetuppending)) {
344     $sessionstarted = optional_param('sessionstarted', 0, PARAM_BOOL);
345     if (!$sessionstarted) {
346         redirect("index.php?sessionstarted=1&lang=$CFG->lang");
347     } else {
348         $sessionverify = optional_param('sessionverify', 0, PARAM_BOOL);
349         if (!$sessionverify) {
350             $SESSION->sessionverify = 1;
351             redirect("index.php?sessionstarted=1&sessionverify=1&lang=$CFG->lang");
352         } else {
353             if (empty($SESSION->sessionverify)) {
354                 print_error('installsessionerror', 'admin', "index.php?sessionstarted=1&lang=$CFG->lang");
355             }
356             unset($SESSION->sessionverify);
357         }
358     }
360     // at this stage there can be only one admin unless more were added by install - users may change username, so do not rely on that
361     $adminids = explode(',', $CFG->siteadmins);
362     $adminuser = get_complete_user_data('id', reset($adminids));
364     if ($adminuser->password === 'adminsetuppending') {
365         // prevent installation hijacking
366         if ($adminuser->lastip !== getremoteaddr()) {
367             print_error('installhijacked', 'admin');
368         }
369         // login user and let him set password and admin details
370         $adminuser->newadminuser = 1;
371         complete_user_login($adminuser);
372         redirect("$CFG->wwwroot/user/editadvanced.php?id=$adminuser->id"); // Edit thyself
374     } else {
375         unset_config('adminsetuppending');
376     }
378 } else {
379     // just make sure upgrade logging is properly terminated
380     upgrade_finished('upgradesettings.php');
383 // Turn xmlstrictheaders back on now.
384 $CFG->xmlstrictheaders = $origxmlstrictheaders;
385 unset($origxmlstrictheaders);
387 // Check for valid admin user - no guest autologin
388 require_login(0, false);
389 $context = get_context_instance(CONTEXT_SYSTEM);
390 require_capability('moodle/site:config', $context);
392 // check that site is properly customized
393 $site = get_site();
394 if (empty($site->shortname)) {
395     // probably new installation - lets return to frontpage after this step
396     // remove settings that we want uninitialised
397     unset_config('registerauth');
398     redirect('upgradesettings.php?return=site');
401 // Check if we are returning from moodle.org registration and if so, we mark that fact to remove reminders
402 if (!empty($id) and $id == $CFG->siteidentifier) {
403     set_config('registered', time());
406 // setup critical warnings before printing admin tree block
407 $insecuredataroot = is_dataroot_insecure(true);
408 $SESSION->admin_critical_warning = ($insecuredataroot==INSECURE_DATAROOT_ERROR);
410 $adminroot = admin_get_root();
412 // Check if there are any new admin settings which have still yet to be set
413 if (any_new_admin_settings($adminroot)){
414     redirect('upgradesettings.php');
417 // Everything should now be set up, and the user is an admin
419 // Print default admin page with notifications.
420 $errorsdisplayed = defined('WARN_DISPLAY_ERRORS_ENABLED');
422 $lastcron = $DB->get_field_sql('SELECT MAX(lastcron) FROM {modules}');
423 $cronoverdue = ($lastcron < time() - 3600 * 24);
424 $dbproblems = $DB->diagnose();
425 $maintenancemode = !empty($CFG->maintenance_enabled);
427 $updateschecker = available_update_checker::instance();
428 $availableupdates = $updateschecker->get_update_info('core',
429     array('minmaturity' => $CFG->updateminmaturity, 'notifybuilds' => $CFG->updatenotifybuilds));
430 $availableupdatesfetch = $updateschecker->get_last_timefetched();
432 $buggyiconvnomb = (!function_exists('mb_convert_encoding') and @iconv('UTF-8', 'UTF-8//IGNORE', '100'.chr(130).'€') !== '100€');
433 //check if the site is registered on Moodle.org
434 $registered = $DB->count_records('registration_hubs', array('huburl' => HUB_MOODLEORGHUBURL, 'confirmed' => 1));
436 admin_externalpage_setup('adminnotifications');
438 if ($fetchupdates) {
439     require_sesskey();
440     $updateschecker->fetch();
441     redirect($PAGE->url);
444 $output = $PAGE->get_renderer('core', 'admin');
445 echo $output->admin_notifications_page($maturity, $insecuredataroot, $errorsdisplayed,
446         $cronoverdue, $dbproblems, $maintenancemode, $availableupdates, $availableupdatesfetch, $buggyiconvnomb,
447         $registered);