Changeset 2175:44a940977175 for admin/plugins.php
- Timestamp:
- 09/30/13 21:16:20 (12 years ago)
- Branch:
- dcRepo
- Parents:
- 2174:6ed25e45a14e (diff), 2173:94520262a1b8 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
admin/plugins.php
r2166 r2175 13 13 require dirname(__FILE__).'/../inc/admin/prepend.php'; 14 14 15 dcPage::checkSuper(); 16 17 $default_tab = !empty($_REQUEST['tab']) ? html::escapeHTML($_REQUEST['tab']) : 'plugins'; 18 19 $p_paths = explode(PATH_SEPARATOR, DC_PLUGINS_ROOT); 20 $p_path = array_pop($p_paths); 21 unset($p_paths); 22 23 $is_writable = false; 24 if (is_dir($p_path) && is_writeable($p_path)) { 25 $is_writable = true; 26 $p_path_pat = preg_quote($p_path,'!'); 27 } 28 29 $plugin_id = !empty($_POST['plugin_id']) ? $_POST['plugin_id'] : null; 30 31 if ($is_writable) 32 { 33 # Delete plugin 34 if ($plugin_id && !empty($_POST['delete'])) 35 { 36 try 37 { 38 if (empty($_POST['deactivated'])) 39 { 40 if (!$core->plugins->moduleExists($plugin_id)) { 41 throw new Exception(__('No such plugin.')); 42 } 43 44 $plugin = $core->plugins->getModules($plugin_id); 45 $plugin['id'] = $plugin_id; 46 47 if (!preg_match('!^'.$p_path_pat.'!', $plugin['root'])) { 48 throw new Exception(__('You don\'t have permissions to delete this plugin.')); 49 } 50 51 # --BEHAVIOR-- pluginBeforeDelete 52 $core->callBehavior('pluginsBeforeDelete', $plugin); 53 54 $core->plugins->deleteModule($plugin_id); 55 56 # --BEHAVIOR-- pluginAfterDelete 57 $core->callBehavior('pluginsAfterDelete', $plugin); 58 } 59 else 60 { 61 $core->plugins->deleteModule($plugin_id,true); 62 } 63 64 http::redirect('plugins.php?removed=1'); 15 dcPage::check('admin'); 16 17 # -------------------------------------------------- 18 # @todo Add settings to Dotclear update features 19 if ($core->blog->settings->system->plugins_allow_multi_install === null) { 20 $core->blog->settings->system->put( 21 'plugins_allow_multi_install', false, 'boolean', 'Allow multi-installation for plugins', true, true 22 ); 23 } 24 if ($core->blog->settings->system->repository_plugin_url === null) { 25 $core->blog->settings->system->put( 26 'repository_plugin_url', 'http://update.dotaddict.org/dc2/plugins.xml', 'string', 'Plugins XML feed location', true, true 27 ); 28 } 29 # -------------------------------------------------- 30 31 # -- Repository helper -- 32 $repository = new dcRepository( 33 $core->plugins, 34 $core->blog->settings->system->repository_plugin_url 35 ); 36 $repository->check(); 37 38 # -- Page helper -- 39 $list = new adminModulesList( 40 $core, 41 DC_PLUGINS_ROOT, 42 $core->blog->settings->system->plugins_allow_multi_install 43 ); 44 45 $list::setDistributedModules(array( 46 'aboutConfig', 47 'akismet', 48 'antispam', 49 'attachments', 50 'blogroll', 51 'blowupConfig', 52 'daInstaller', 53 'fairTrackbacks', 54 'importExport', 55 'maintenance', 56 'pages', 57 'pings', 58 'simpleMenu', 59 'tags', 60 'themeEditor', 61 'userPref', 62 'widgets' 63 )); 64 65 # -- Check for module configuration -- 66 $conf_file = false; 67 if (!empty($_REQUEST['conf']) && !empty($_REQUEST['module'])) { 68 if (!$core->plugins->moduleExists($_REQUEST['module'])) { 69 $core->error->add(__('Unknow module ID')); 70 } 71 else { 72 $module = $core->plugins->getModules($_REQUEST['module']); 73 $module = adminModulesList::parseModuleInfo($_REQUEST['module'], $module); 74 75 if (!file_exists(path::real($module['root'].'/_config.php'))) { 76 $core->error->add(__('This module has no configuration file.')); 65 77 } 66 catch (Exception $e) 67 { 68 $core->error->add($e->getMessage()); 78 else { 79 $conf_file = path::real($module['root'].'/_config.php'); 69 80 } 70 81 } 71 # Deactivate plugin 72 elseif ($plugin_id && !empty($_POST['deactivate'])) 73 { 74 try 75 { 76 if (!$core->plugins->moduleExists($plugin_id)) { 77 throw new Exception(__('No such plugin.')); 78 } 79 80 $plugin = $core->plugins->getModules($plugin_id); 81 $plugin['id'] = $plugin_id; 82 83 if (!$plugin['root_writable']) { 84 throw new Exception(__('You don\'t have permissions to deactivate this plugin.')); 85 } 86 87 # --BEHAVIOR-- pluginBeforeDeactivate 88 $core->callBehavior('pluginsBeforeDeactivate', $plugin); 89 90 $core->plugins->deactivateModule($plugin_id); 91 92 # --BEHAVIOR-- pluginAfterDeactivate 93 $core->callBehavior('pluginsAfterDeactivate', $plugin); 94 95 http::redirect('plugins.php'); 82 } 83 84 # -- Display module configuration page -- 85 if ($conf_file) { 86 dcPage::open(__('Plugins management'), 87 88 # --BEHAVIOR-- pluginsToolsHeaders 89 $core->callBehavior('pluginsToolsHeaders', $core, $module['id']), 90 91 dcPage::breadcrumb( 92 array( 93 html::escapeHTML($core->blog->name) => '', 94 '<a href="'.$list->getPageURL().'">'.__('Plugins management').'</a>' => '', 95 '<span class="page-title">'.__('Plugin configuration').'</span>' => '' 96 )) 97 ); 98 99 if (!empty($_GET['done'])){ 100 dcPage::success(__('Plugin successfully configured.')); 101 } 102 103 try { 104 if (!$module['standalone_config']) { 105 echo 106 '<form id="module_config" action="'.$list->getPageURL('conf=1').'" method="post" enctype="multipart/form-data">'. 107 '<h3>'.sprintf(__('Configure plugin "%s"'), html::escapeHTML($module['name'])).'</h3>'. 108 '<p><a class="back" href="'.$list->getPageURL().'#plugins">'.__('Back').'</a></p>'; 96 109 } 97 catch (Exception $e) 98 { 99 $core->error->add($e->getMessage()); 110 define('DC_CONTEXT_PLUGIN', true); 111 112 include $conf_file; 113 114 if (!$module['standalone_config']) { 115 echo 116 '<p class="clear"><input type="submit" name="save" value="'.__('Save').'" />'. 117 form::hidden('module', $module['id']). 118 $core->formNonce().'</p>'. 119 '</form>'; 100 120 } 101 121 } 102 # Activate plugin 103 elseif ($plugin_id && !empty($_POST['activate'])) 104 { 105 try 106 { 107 $p = $core->plugins->getDisabledModules(); 108 if (!isset($p[$plugin_id])) { 109 throw new Exception(__('No such plugin.')); 110 } 111 112 # --BEHAVIOR-- pluginBeforeActivate 113 $core->callBehavior('pluginsBeforeActivate', $plugin_id); 114 115 $core->plugins->activateModule($plugin_id); 116 117 # --BEHAVIOR-- pluginAfterActivate 118 $core->callBehavior('pluginsAfterActivate', $plugin_id); 119 120 http::redirect('plugins.php'); 121 } 122 catch (Exception $e) 123 { 124 $core->error->add($e->getMessage()); 125 } 126 } 127 # Plugin upload 128 elseif ((!empty($_POST['upload_pkg']) && !empty($_FILES['pkg_file'])) || 129 (!empty($_POST['fetch_pkg']) && !empty($_POST['pkg_url']))) 130 { 131 try 132 { 133 if (empty($_POST['your_pwd']) || !$core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY,$_POST['your_pwd']))) { 134 throw new Exception(__('Password verification failed')); 135 } 136 137 if (!empty($_POST['upload_pkg'])) 138 { 139 files::uploadStatus($_FILES['pkg_file']); 140 141 $dest = $p_path.'/'.$_FILES['pkg_file']['name']; 142 if (!move_uploaded_file($_FILES['pkg_file']['tmp_name'],$dest)) { 143 throw new Exception(__('Unable to move uploaded file.')); 144 } 145 } 146 else 147 { 148 $url = urldecode($_POST['pkg_url']); 149 $dest = $p_path.'/'.basename($url); 150 151 try 152 { 153 $client = netHttp::initClient($url,$path); 154 $client->setUserAgent('Dotclear - http://www.dotclear.org/'); 155 $client->useGzip(false); 156 $client->setPersistReferers(false); 157 $client->setOutput($dest); 158 $client->get($path); 159 } 160 catch( Exception $e) 161 { 162 throw new Exception(__('An error occurred while downloading the file.')); 163 } 164 165 unset($client); 166 } 167 168 # --BEHAVIOR-- pluginBeforeAdd 169 $core->callBehavior('pluginsBeforeAdd', $plugin_id); 170 171 $ret_code = $core->plugins->installPackage($dest,$core->plugins); 172 173 # --BEHAVIOR-- pluginAfterAdd 174 $core->callBehavior('pluginsAfterAdd', $plugin_id); 175 176 http::redirect('plugins.php?added='.$ret_code); 177 } 178 catch (Exception $e) 179 { 180 $core->error->add($e->getMessage()); 181 $default_tab = 'addplugin'; 182 } 183 } 184 } 185 186 # Plugin install 187 $plugins_install = $core->plugins->installModules(); 188 189 /* DISPLAY Main page 190 -------------------------------------------------------- */ 122 catch (Exception $e) { 123 echo '<div class="error"><p>'.$e->getMessage().'</p></div>'; 124 } 125 126 dcPage::close(); 127 128 # Stop reading code here 129 return; 130 } 131 132 # -- Execute actions -- 133 if (!empty($_POST) && empty($_REQUEST['conf']) && $core->auth->isSuperAdmin() && $list->isPathWritable()) { 134 try { 135 $list->executeAction('plugins', $core->plugins, $repository); 136 } 137 catch (Exception $e) { 138 $core->error->add($e->getMessage()); 139 } 140 } 141 142 # -- Plugin install -- 143 $plugins_install = null; 144 if (!$core->error->flag()) { 145 $plugins_install = $core->plugins->installModules(); 146 } 147 148 # -- Page header -- 191 149 dcPage::open(__('Plugins management'), 192 150 dcPage::jsLoad('js/_plugins.js'). 193 dcPage::jsPageTabs($default_tab), 151 dcPage::jsPageTabs(). 152 153 # --BEHAVIOR-- pluginsToolsHeaders 154 $core->callBehavior('pluginsToolsHeaders', $core, false), 155 194 156 dcPage::breadcrumb( 195 157 array( … … 199 161 ); 200 162 201 if (!empty($_GET['removed'])) { 202 dcPage::success(__('Plugin has been successfully deleted.')); 203 } 204 if (!empty($_GET['added'])) { 205 dcPage::success(($_GET['added'] == 2 ? __('Plugin has been successfully upgraded') : __('Plugin has been successfully installed.'))); 206 } 207 208 # Plugins install messages 209 if (!empty($plugins_install['success'])) 210 { 211 echo '<div class="static-msg">'.__('Following plugins have been installed:').'<ul>'; 163 # -- Succes messages -- 164 if (!empty($_GET['msg'])) { 165 $list->displayMessage($_GET['msg']); 166 } 167 168 # -- Plugins install messages -- 169 if (!empty($plugins_install['success'])) { 170 echo 171 '<div class="static-msg">'.__('Following plugins have been installed:').'<ul>'; 212 172 foreach ($plugins_install['success'] as $k => $v) { 213 echo '<li>'.$k.'</li>'; 214 } 215 echo '</ul></div>'; 216 } 217 if (!empty($plugins_install['failure'])) 218 { 219 echo '<div class="error">'.__('Following plugins have not been installed:').'<ul>'; 173 echo 174 '<li>'.$k.'</li>'; 175 } 176 echo 177 '</ul></div>'; 178 } 179 if (!empty($plugins_install['failure'])) { 180 echo 181 '<div class="error">'.__('Following plugins have not been installed:').'<ul>'; 220 182 foreach ($plugins_install['failure'] as $k => $v) { 221 echo '<li>'.$k.' ('.$v.')</li>'; 222 } 223 echo '</ul></div>'; 183 echo 184 '<li>'.$k.' ('.$v.')</li>'; 185 } 186 echo 187 '</ul></div>'; 188 } 189 190 # -- Display modules lists -- 191 if ($core->auth->isSuperAdmin() && $list->isPathWritable()) { 192 193 # Updated modules from repo 194 $modules = $repository->get(true); 195 if (!empty($modules)) { 196 echo 197 '<div class="multi-part" id="update" title="'.html::escapeHTML(__('Update plugins')).'">'. 198 '<h3>'.html::escapeHTML(__('Update plugins')).'</h3>'. 199 '<p>'.sprintf( 200 __('There is one plugin to update available from %2$s.', 'There are %s plugins to update available from %s.', count($modules)), 201 count($modules), 202 '<a href="http://dotaddict.org/dc2/plugins">Dotaddict</a>' 203 ).'</p>'; 204 205 $list 206 ->newList('plugin-update') 207 ->setModules($modules) 208 ->setPageTab('update') 209 ->displayModulesList( 210 /*cols */ array('icon', 'name', 'version', 'current_version', 'desc'), 211 /* actions */ array('update') 212 ); 213 214 echo 215 '</div>'; 216 } 224 217 } 225 218 226 219 # List all active plugins 227 echo '<p>'.__('Plugins add new functionalities to Dotclear. '.228 'Here you can activate or deactivate installed plugins.').'</p>';229 230 echo (!$core->plugins->moduleExists('daInstaller') ?231 sprintf('<p><strong>'.__('You can find additional plugins for your blog on %s.').'</strong></p>',232 '<a href="http://plugins.dotaddict.org/dc2/">Dotaddict</a>') :233 sprintf('<p><strong>'.__('You can find additional plugins for your blog on %s or using the %s.').'</strong></p>',234 '<a href="http://plugins.dotaddict.org/dc2/">Dotaddict</a>',235 '<a href="plugin.php?p=daInstaller">'.__('DotAddict.org Installer').'</a>'));236 237 if ($is_writable) {238 echo '<p>'.__('To install or upgrade a plugin you generally just need to upload it '.239 'in "Install or upgrade a plugin" section.');240 } else {241 echo '<p>'.__('To install or upgrade a plugin you just need to extract it in your plugins directory.');242 }243 echo '</p>';244 245 220 echo 246 '<div class="multi-part" id="plugins" title="'.__('Plugins').'">'; 247 248 $p_available = $core->plugins->getModules(); 249 uasort($p_available,create_function('$a,$b','return strcasecmp($a["name"],$b["name"]);')); 250 if (!empty($p_available)) 251 { 221 '<div class="multi-part" id="plugins" title="'.__('Installed plugins').'">'; 222 223 $modules = $core->plugins->getModules(); 224 if (!empty($modules)) { 225 252 226 echo 253 227 '<h3>'.__('Activated plugins').'</h3>'. 254 '<div class="table-outer clear">'. 255 '<table class="plugins"><tr>'. 256 '<th>'.__('Plugin').'</th>'. 257 '<th class="nowrap">'.__('Version').'</th>'. 258 '<th class="nowrap">'.__('Details').'</th>'. 259 '<th class="nowrap">'.__('Action').'</th>'. 260 '</tr>'; 261 262 $distrib_plugins = array('aboutConfig','akismet','antispam','attachments','blogroll','blowupConfig','daInstaller', 263 'fairTrackbacks','importExport','maintenance','pages','pings','simpleMenu','tags','themeEditor','userPref','widgets'); 264 $distrib_img = '<img src="images/dotclear_pw.png"'. 265 ' alt="'.__('Plugin from official distribution').'" title="'.__('Plugin from official distribution').'" />'; 266 267 foreach ($p_available as $k => $v) 268 { 269 $is_deletable = $is_writable && preg_match('!^'.$p_path_pat.'!',$v['root']); 270 $is_deactivable = $v['root_writable']; 271 $is_distrib = in_array($k, $distrib_plugins); 272 273 echo 274 '<tr class="line wide">'. 275 '<td class="minimal nowrap"><strong>'.html::escapeHTML($k).'</strong></td>'. 276 '<td class="minimal">'.html::escapeHTML($v['version']).'</td>'. 277 '<td class="maximal'.($is_distrib ? ' distrib' : '').'"><strong>'.html::escapeHTML(__($v['name'])).'</strong> '. 278 '<br />'.html::escapeHTML(__($v['desc'])).($is_distrib ? ' '.$distrib_img : '').'</td>'. 279 '<td class="nowrap action">'; 280 281 if ($is_deletable || $is_deactivable) 282 { 283 echo 284 '<form action="plugins.php" method="post">'. 285 '<div>'. 286 $core->formNonce(). 287 form::hidden(array('plugin_id'),html::escapeHTML($k)). 288 ($is_deactivable ? '<input type="submit" name="deactivate" value="'.__('Deactivate').'" /> ' : ''). 289 ($is_deletable ? '<input type="submit" class="delete" name="delete" value="'.__('Delete').'" /> ' : ''). 290 '</div>'. 291 '</form>'; 292 } 293 294 echo 295 '</td>'. 296 '</tr>'; 297 } 298 echo 299 '</table></div>'; 300 } 301 302 $p_disabled = $core->plugins->getDisabledModules(); 303 uksort($p_disabled,create_function('$a,$b','return strcasecmp($a,$b);')); 304 if (!empty($p_disabled)) 305 { 228 '<p>'.__('Manage installed plugins from this list.').'</p>'; 229 230 $list 231 ->newList('plugin-activate') 232 ->setModules($modules) 233 ->setPageTab('plugins') 234 ->displayModulesList( 235 /* cols */ array('expander', 'icon', 'name', 'config', 'version', 'desc', 'distrib'), 236 /* actions */ array('deactivate', 'delete') 237 ); 238 } 239 240 # Deactivated modules 241 $modules = $core->plugins->getDisabledModules(); 242 if (!empty($modules)) { 243 306 244 echo 307 245 '<h3>'.__('Deactivated plugins').'</h3>'. 308 '<div class="clear table-outer">'. 309 '<table class="plugins"><tr>'. 310 '<th>'.__('Plugin').'</th>'. 311 '<th class="nowrap">'.__('Action').'</th>'. 312 '</tr>'; 313 314 foreach ($p_disabled as $k => $v) 315 { 316 $is_deletable = $is_writable && preg_match('!^'.$p_path_pat.'!',$v['root']); 317 $is_activable = $v['root_writable']; 318 319 echo 320 '<tr class="line wide">'. 321 '<td class="maximal nowrap"><strong>'.html::escapeHTML($k).'</strong></td>'. 322 '<td class="nowrap action">'; 323 324 if ($is_deletable || $is_activable) 325 { 326 echo 327 '<form action="plugins.php" method="post">'. 328 '<div>'. 329 $core->formNonce(). 330 form::hidden(array('plugin_id'),html::escapeHTML($k)). 331 form::hidden(array('deactivated'),1). 332 ($is_activable ? '<input type="submit" name="activate" value="'.__('Activate').'" /> ' : ''). 333 ($is_deletable ? '<input type="submit" class="delete" name="delete" value="'.__('Delete').'" /> ' : ''). 334 '</div>'. 335 '</form>'; 336 } 337 338 echo 339 '</td>'. 340 '</tr>'; 341 } 342 echo 343 '</table></div>'; 344 } 345 346 echo '</div>'; 347 348 # Add a new plugin 349 echo 350 '<div class="multi-part" id="addplugin" title="'.__('Install or upgrade a plugin').'">'; 351 352 if ($is_writable) 353 { 246 '<p>'.__('Deactivated plugins are installed but not usable. You can activate them from here.').'</p>'; 247 248 $list 249 ->newList('plugin-deactivate') 250 ->setModules($modules) 251 ->setPageTab('plugins') 252 ->displayModulesList( 253 /* cols */ array('icon', 'name', 'distrib'), 254 /* actions */ array('activate', 'delete') 255 ); 256 } 257 258 echo 259 '</div>'; 260 261 if ($core->auth->isSuperAdmin() && $list->isPathWritable()) { 262 263 # New modules from repo 264 $search = $list->getSearchQuery(); 265 $modules = $search ? $repository->search($search) : $repository->get(); 266 267 echo 268 '<div class="multi-part" id="new" title="'.__('Add plugins from Dotaddict').'">'. 269 '<h3>'.__('Add plugins from Dotaddict repository').'</h3>'; 270 271 $list 272 ->newList('plugin-new') 273 ->setModules($modules) 274 ->setPageTab('new') 275 ->displaySearchForm() 276 ->displayNavMenu() 277 ->displayModulesList( 278 /* cols */ array('expander', 'name', 'version', 'desc'), 279 /* actions */ array('install'), 280 /* nav limit */ true 281 ); 282 283 echo 284 '<p class="info vertical-separator">'.sprintf( 285 __("Visit %s repository, the resources center for Dotclear."), 286 '<a href="http://dotaddict.org/dc2/plugins">Dotaddict</a>' 287 ). 288 '</p>'. 289 290 '</div>'; 291 292 # Add a new plugin 293 echo 294 '<div class="multi-part" id="addplugin" title="'.__('Install or upgrade manually').'">'; 295 354 296 echo '<p>'.__('You can install plugins by uploading or downloading zip files.').'</p>'; 355 297 356 # 'Upload plugin' form 357 echo 358 '<form method="post" action="plugins.php" id="uploadpkg" enctype="multipart/form-data" class="fieldset">'. 359 '<h3>'.__('Upload a zip file').'</h3>'. 360 '<p class="field"><label for="pkg_file" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Plugin zip file:').'</label> '. 361 '<input type="file" id="pkg_file" name="pkg_file" /></p>'. 362 '<p class="field"><label for="your_pwd1" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Your password:').'</label> '. 363 form::password(array('your_pwd','your_pwd1'),20,255).'</p>'. 364 '<p><input type="submit" name="upload_pkg" value="'.__('Upload plugin').'" />'. 365 $core->formNonce(). 366 '</p>'. 367 '</form>'; 368 369 # 'Fetch plugin' form 370 echo 371 '<form method="post" action="plugins.php" id="fetchpkg" class="fieldset">'. 372 '<h3>'.__('Download a zip file').'</h3>'. 373 '<p class="field"><label for="pkg_url" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Plugin zip file URL:').'</label> '. 374 form::field(array('pkg_url','pkg_url'),40,255).'</p>'. 375 '<p class="field"><label for="your_pwd2" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Your password:').'</label> '. 376 form::password(array('your_pwd','your_pwd2'),20,255).'</p>'. 377 '<p><input type="submit" name="fetch_pkg" value="'.__('Download plugin').'" />'. 378 $core->formNonce().'</p>'. 379 '</form>'; 380 } 381 else 382 { 383 echo 384 '<p class="static-msg">'. 385 __('To enable this function, please give write access to your plugins directory.'). 386 '</p>'; 387 } 388 echo '</div>'; 298 $list->displayManualForm(); 299 300 echo 301 '</div>'; 302 } 389 303 390 304 # --BEHAVIOR-- pluginsToolsTabs 391 $core->callBehavior('pluginsToolsTabs',$core); 305 $core->callBehavior('pluginsToolsTabs', $core); 306 307 # -- Notice for super admin -- 308 if ($core->auth->isSuperAdmin() && !$list->isPathWritable()) { 309 echo 310 '<p class="warning">'.__('Some functions are disabled, please give write access to your plugins directory to enable them.').'</p>'; 311 } 392 312 393 313 dcPage::close(); -
admin/plugins.php
r2174 r2175 157 157 array( 158 158 __('System') => '', 159 '<span class="page-title">'.__('Plugins management').'</span>'=> ''159 __('Plugins management') => '' 160 160 )) 161 161 );
Note: See TracChangeset
for help on using the changeset viewer.