Commit | Line | Data |
---|---|---|
b9934a17 DM |
1 | <?php |
2 | ||
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/>. | |
17 | ||
18 | /** | |
19 | * UI for general plugins management | |
20 | * | |
c2d2001a DM |
21 | * Supported HTTP parameters: |
22 | * | |
23 | * ?fetchremote=1 - check for available updates | |
24 | * ?updatesonly=1 - display plugins with available update only | |
25 | * ?contribonly=1 - display non-standard add-ons only | |
26 | * ?uninstall=foo_bar - uninstall the given plugin | |
27 | * ?delete=foo_bar - delete the plugin folder (it must not be installed) | |
28 | * &confirm=1 - confirm the uninstall or delete action | |
29 | * | |
b9934a17 DM |
30 | * @package core |
31 | * @subpackage admin | |
32 | * @copyright 2011 David Mudrak <david@moodle.com> | |
33 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | |
34 | */ | |
35 | ||
36 | require_once(dirname(dirname(__FILE__)) . '/config.php'); | |
37 | require_once($CFG->libdir . '/adminlib.php'); | |
38 | require_once($CFG->libdir . '/pluginlib.php'); | |
436d9447 | 39 | require_once($CFG->libdir . '/filelib.php'); |
b9934a17 | 40 | |
b9934a17 | 41 | admin_externalpage_setup('pluginsoverview'); |
1c2bf99e | 42 | require_capability('moodle/site:config', context_system::instance()); |
3204daea DM |
43 | |
44 | $fetchremote = optional_param('fetchremote', false, PARAM_BOOL); | |
4df8bced DM |
45 | $updatesonly = optional_param('updatesonly', false, PARAM_BOOL); |
46 | $contribonly = optional_param('contribonly', false, PARAM_BOOL); | |
436d9447 DM |
47 | $uninstall = optional_param('uninstall', '', PARAM_COMPONENT); |
48 | $delete = optional_param('delete', '', PARAM_COMPONENT); | |
49 | $confirmed = optional_param('confirm', false, PARAM_BOOL); | |
50 | ||
51 | $output = $PAGE->get_renderer('core', 'admin'); | |
3204daea DM |
52 | |
53 | $pluginman = plugin_manager::instance(); | |
436d9447 DM |
54 | |
55 | if ($uninstall) { | |
56 | require_sesskey(); | |
57 | $pluginfo = $pluginman->get_plugin_info($uninstall); | |
58 | ||
c2d2001a | 59 | // Make sure we know the plugin. |
436d9447 DM |
60 | if (is_null($pluginfo)) { |
61 | throw new moodle_exception('err_uninstalling_unknown_plugin', 'core_plugin', '', array('plugin' => $uninstall), | |
62 | 'plugin_manager::get_plugin_info() returned null for the plugin to be uninstalled'); | |
63 | } | |
64 | ||
c2d2001a DM |
65 | $pluginname = $pluginman->plugin_name($pluginfo->component); |
66 | $PAGE->set_title($pluginname); | |
67 | $PAGE->navbar->add(get_string('uninstalling', 'core_plugin', array('name' => $pluginname))); | |
68 | ||
69 | if (!$pluginman->can_uninstall_plugin($pluginfo->component)) { | |
70 | throw new moodle_exception('err_cannot_uninstall_plugin', 'core_plugin', '', | |
71 | array('plugin' => $pluginfo->component), | |
72 | 'plugin_manager::can_uninstall_plugin() returned false'); | |
436d9447 DM |
73 | } |
74 | ||
75 | if (!$confirmed) { | |
76 | $continueurl = new moodle_url($PAGE->url, array('uninstall' => $pluginfo->component, 'sesskey' => sesskey(), 'confirm' => 1)); | |
77 | echo $output->plugin_uninstall_confirm_page($pluginman, $pluginfo, $continueurl); | |
78 | exit(); | |
79 | ||
80 | } else { | |
81 | $messages = array(); // Collect uninstall process messages here. | |
82 | $pluginman->uninstall_plugin($pluginfo->component, $messages); | |
83 | ||
84 | if ($pluginman->is_plugin_folder_removable($pluginfo->component)) { | |
85 | $continueurl = new moodle_url($PAGE->url, array('delete' => $pluginfo->component, 'sesskey' => sesskey(), 'confirm' => 1)); | |
86 | echo $output->plugin_uninstall_results_removable_page($pluginman, $pluginfo, $messages, $continueurl); | |
87 | exit(); | |
88 | ||
89 | } else { | |
90 | echo $output->plugin_uninstall_results_page($pluginman, $pluginfo, $messages); | |
91 | exit(); | |
92 | } | |
93 | } | |
94 | } | |
95 | ||
96 | if ($delete and $confirmed) { | |
97 | require_sesskey(); | |
98 | $pluginfo = $pluginman->get_plugin_info($delete); | |
99 | ||
100 | // Make sure we know the plugin. | |
101 | if (is_null($pluginfo)) { | |
102 | throw new moodle_exception('err_removing_unknown_plugin', 'core_plugin', '', array('plugin' => $delete), | |
103 | 'plugin_manager::get_plugin_info() returned null for the plugin to be deleted'); | |
104 | } | |
105 | ||
c2d2001a DM |
106 | $pluginname = $pluginman->plugin_name($pluginfo->component); |
107 | $PAGE->set_title($pluginname); | |
108 | $PAGE->navbar->add(get_string('uninstalling', 'core_plugin', array('name' => $pluginname))); | |
109 | ||
436d9447 DM |
110 | // Make sure it is not installed. |
111 | if (!is_null($pluginfo->versiondb)) { | |
112 | throw new moodle_exception('err_removing_installed_plugin', 'core_plugin', '', | |
113 | array('plugin' => $pluginfo->component, 'versiondb' => $pluginfo->versiondb), | |
114 | 'plugin_manager::get_plugin_info() returned not-null versiondb for the plugin to be deleted'); | |
115 | } | |
116 | ||
117 | // Make sure the folder is removable. | |
118 | if (!$pluginman->is_plugin_folder_removable($pluginfo->component)) { | |
119 | throw new moodle_exception('err_removing_unremovable_folder', 'core_plugin', '', | |
120 | array('plugin' => $pluginfo->component, 'rootdir' => $pluginfo->rootdir), | |
121 | 'plugin root folder is not removable as expected'); | |
122 | } | |
123 | ||
124 | // Make sure the folder is within Moodle installation tree. | |
125 | if (strpos($pluginfo->rootdir, $CFG->dirroot) !== 0) { | |
126 | throw new moodle_exception('err_unexpected_plugin_rootdir', 'core_plugin', '', | |
127 | array('plugin' => $pluginfo->component, 'rootdir' => $pluginfo->rootdir, 'dirroot' => $CFG->dirroot), | |
128 | 'plugin root folder not in the moodle dirroot'); | |
129 | } | |
130 | ||
131 | // So long, and thanks for all the bugs. | |
132 | fulldelete($pluginfo->rootdir); | |
133 | cache::make('core', 'pluginlist')->purge(); | |
134 | redirect($PAGE->url); | |
135 | } | |
136 | ||
3204daea DM |
137 | $checker = available_update_checker::instance(); |
138 | ||
4df8bced DM |
139 | // Filtering options. |
140 | $options = array( | |
141 | 'updatesonly' => $updatesonly, | |
142 | 'contribonly' => $contribonly, | |
143 | ); | |
144 | ||
3204daea | 145 | if ($fetchremote) { |
00ea11f8 DM |
146 | require_sesskey(); |
147 | $checker->fetch(); | |
4df8bced | 148 | redirect(new moodle_url($PAGE->url, $options)); |
3204daea DM |
149 | } |
150 | ||
bcc8397a DM |
151 | $deployer = available_update_deployer::instance(); |
152 | if ($deployer->enabled()) { | |
153 | $myurl = new moodle_url($PAGE->url, array('updatesonly' => $updatesonly, 'contribonly' => $contribonly)); | |
154 | $deployer->initialize($myurl, $myurl); | |
155 | ||
156 | $deploydata = $deployer->submitted_data(); | |
157 | if (!empty($deploydata)) { | |
158 | echo $output->upgrade_plugin_confirm_deploy_page($deployer, $deploydata); | |
159 | die(); | |
160 | } | |
161 | } | |
162 | ||
4df8bced | 163 | echo $output->plugin_management_page($pluginman, $checker, $options); |