Skip to content

Commit

Permalink
feature:2250
Browse files Browse the repository at this point in the history
Incompatible plugins and obsolete plugins may not be activated.

git-svn-id: http://piwigo.org/svn/trunk@10098 68402e56-0260-453c-a942-63ccdbb3a9ee
  • Loading branch information
patdenice committed Apr 6, 2011
1 parent a8b750b commit 0dd8001
Show file tree
Hide file tree
Showing 4 changed files with 178 additions and 37 deletions.
130 changes: 113 additions & 17 deletions admin/include/plugins.class.php
Expand Up @@ -26,6 +26,7 @@ class plugins
var $fs_plugins = array();
var $db_plugins_by_id = array();
var $server_plugins = array();
var $default_plugins = array('LocalFilesEditor', 'language_switch', 'c13y_upgrade', 'admin_multi_view');

/**
* Initialize $fs_plugins and $db_plugins_by_id
Expand Down Expand Up @@ -185,6 +186,9 @@ function perform_action($action, $plugin_id)
array_push($errors, 'CANNOT DELETE - NO SUCH PLUGIN');
break;
}
$query = '
DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\'';
pwg_query($query);
if (!$this->deltree(PHPWG_PLUGINS_PATH . $plugin_id))
{
$this->send_to_trash(PHPWG_PLUGINS_PATH . $plugin_id);
Expand Down Expand Up @@ -283,23 +287,12 @@ function sort_fs_plugins($order='name')
}
}

/**
* Retrieve PEM server datas to $server_plugins
*/
function get_server_plugins($new=false)
// Retrieve PEM versions
function get_versions_to_check($version=PHPWG_VERSION)
{
global $user;

$get_data = array(
'category_id' => 12,
'format' => 'php',
);

// Retrieve PEM versions
$version = PHPWG_VERSION;
$versions_to_check = array();
$url = PEM_URL . '/api/get_version_list.php';
if (fetchRemote($url, $result, $get_data) and $pem_versions = @unserialize($result))
$url = PEM_URL . '/api/get_version_list.php?category=12&format=php';
if (fetchRemote($url, $result) and $pem_versions = @unserialize($result))
{
if (!preg_match('/^\d+\.\d+\.\d+/', $version))
{
Expand All @@ -314,6 +307,17 @@ function get_server_plugins($new=false)
}
}
}
return $versions_to_check;
}

/**
* Retrieve PEM server datas to $server_plugins
*/
function get_server_plugins($new=false)
{
global $user;

$versions_to_check = $this->get_versions_to_check();
if (empty($versions_to_check))
{
return false;
Expand All @@ -331,12 +335,13 @@ function get_server_plugins($new=false)

// Retrieve PEM plugins infos
$url = PEM_URL . '/api/get_revision_list.php';
$get_data = array_merge($get_data, array(
$get_data = array(
'category_id' => 12,
'format' => 'php',
'last_revision_only' => 'true',
'version' => implode(',', $versions_to_check),
'lang' => substr($user['language'], 0, 2),
'get_nb_downloads' => 'true',
)
);

if (!empty($plugins_to_check))
Expand Down Expand Up @@ -365,6 +370,73 @@ function get_server_plugins($new=false)
}
return false;
}

function get_incompatible_plugins()
{
if (isset($_SESSION['incompatible_plugins']))
{
return $_SESSION['incompatible_plugins'];
}

$_SESSION['incompatible_plugins'] = array();

$versions_to_check = $this->get_versions_to_check();
if (empty($versions_to_check))
{
return false;
}

// Plugins to check
$plugins_to_check = array();
foreach($this->fs_plugins as $fs_plugin)
{
if (isset($fs_plugin['extension']))
{
$plugins_to_check[] = $fs_plugin['extension'];
}
}

// Retrieve PEM plugins infos
$url = PEM_URL . '/api/get_revision_list.php';
$get_data = array(
'category_id' => 12,
'format' => 'php',
'version' => implode(',', $versions_to_check),
'extension_include' => implode(',', $plugins_to_check),
);

if (fetchRemote($url, $result, $get_data))
{
$pem_plugins = @unserialize($result);
if (!is_array($pem_plugins))
{
return false;
}

$server_plugins = array();
foreach ($pem_plugins as $plugin)
{
if (!isset($server_plugins[$plugin['extension_id']]))
{
$server_plugins[$plugin['extension_id']] = array();
}
array_push($server_plugins[$plugin['extension_id']], $plugin['revision_name']);
}

foreach ($this->fs_plugins as $plugin_id => $fs_plugin)
{
if (isset($fs_plugin['extension'])
and !in_array($plugin_id, $this->default_plugins)
and $fs_plugin['version'] != 'auto'
and (!isset($server_plugins[$fs_plugin['extension']]) or !in_array($fs_plugin['version'], $server_plugins[$fs_plugin['extension']])))
{
$_SESSION['incompatible_plugins'][$plugin_id] = $fs_plugin['version'];
}
}
return $_SESSION['incompatible_plugins'];
}
return false;
}

/**
* Sort $server_plugins
Expand Down Expand Up @@ -483,6 +555,30 @@ function extract_plugin_files($action, $revision, $dest)
@unlink($archive);
return $status;
}

function get_merged_extensions($version=PHPWG_VERSION)
{
if (!isset($_SESSION['merged_extensions']))
{
$_SESSION['merged_extensions'] = array();
if (fetchRemote(MERGED_EXTENSIONS_URL, $result))
{
$rows = explode("\n", $result);
foreach ($rows as $row)
{
if (preg_match('/^(\d+\.\d+): *(.*)$/', $row, $match))
{
if (version_compare($version, $match[1], '>='))
{
$extensions = explode(',', trim($match[2]));
$_SESSION['merged_extensions'] = array_merge($_SESSION['merged_extensions'], $extensions);
}
}
}
}
}
return $_SESSION['merged_extensions'];
}

/**
* delete $path directory
Expand Down
64 changes: 46 additions & 18 deletions admin/plugins_list.php
Expand Up @@ -67,19 +67,38 @@
// +-----------------------------------------------------------------------+

$plugins->sort_fs_plugins('name');
$plugins->get_merged_extensions();
$plugins->get_incompatible_plugins();
$merged_plugins = array();

foreach($plugins->fs_plugins as $plugin_id => $fs_plugin)
{
if (isset($_SESSION['incompatible_plugins'][$plugin_id])
and $fs_plugin['version'] != $_SESSION['incompatible_plugins'][$plugin_id])
{
// Incompatible plugins must be reinitilized
unset($_SESSION['incompatible_plugins']);
$plugins->get_incompatible_plugins();
}

$tpl_plugin = array(
'NAME' => $fs_plugin['name'],
'VISIT_URL' => $fs_plugin['uri'],
'VERSION' => $fs_plugin['version'],
'DESC' => $fs_plugin['description'],
'AUTHOR' => $fs_plugin['author'],
'AUTHOR_URL' => @$fs_plugin['author uri'],
'U_ACTION' => sprintf($action_url, $plugin_id)
'U_ACTION' => sprintf($action_url, $plugin_id),
'INCOMPATIBLE' => isset($_SESSION['incompatible_plugins'][$plugin_id]),
);

if (isset($fs_plugin['extension']) and in_array($fs_plugin['extension'], $_SESSION['merged_extensions']))
{
$tpl_plugin['STATE'] = 'merged';
array_push($merged_plugins, $tpl_plugin);
continue;
}

if (isset($plugins->db_plugins_by_id[$plugin_id]))
{
$tpl_plugin['STATE'] = $plugins->db_plugins_by_id[$plugin_id]['state'];
Expand All @@ -92,32 +111,41 @@
$template->append('plugins', $tpl_plugin);
}

$template->append('plugin_states', 'active');
$template->append('plugin_states', 'inactive');
$template->append('plugin_states', 'uninstalled');

$missing_plugin_ids = array_diff(
array_keys($plugins->db_plugins_by_id),
array_keys($plugins->fs_plugins)
);

foreach($missing_plugin_ids as $plugin_id)
if (count($missing_plugin_ids) > 0)
{
$template->append(
'plugins',
array(
'NAME' => $plugin_id,
'VERSION' => $plugins->db_plugins_by_id[$plugin_id]['version'],
'DESC' => "ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW !",
'U_ACTION' => sprintf($action_url, $plugin_id),
'STATE' => 'missing',
)
);
foreach($missing_plugin_ids as $plugin_id)
{
$template->append(
'plugins',
array(
'NAME' => $plugin_id,
'VERSION' => $plugins->db_plugins_by_id[$plugin_id]['version'],
'DESC' => "ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW !",
'U_ACTION' => sprintf($action_url, $plugin_id),
'STATE' => 'missing',
)
);
}
$template->append('plugin_states', 'missing');
}

$template->append('plugin_states', 'active');
$template->append('plugin_states', 'inactive');
$template->append('plugin_states', 'uninstalled');

if (count($missing_plugin_ids) > 0)
if (count($merged_plugins) > 0)
{
$template->append('plugin_states', 'missing');
foreach($merged_plugins as $tpl_plugin)
{
$tpl_plugin['DESC'] = l10n("THIS PLUGIN IS NOW PART OF PIWIGO CORE. UNINSTALL IT NOW.");
$template->append('plugins', $tpl_plugin);
}
$template->append('plugin_states', 'merged');
}

$template->assign_var_from_handle('ADMIN_CONTENT', 'plugins');
Expand Down
20 changes: 18 additions & 2 deletions admin/themes/default/template/plugins_list.tpl
@@ -1,3 +1,16 @@
{footer_script}
var incompatible_msg = '{'WARNING! This plugin does not seem to be compatible with this version of Piwigo.'|@translate|@escape:'javascript'}';
incompatible_msg += '\n';
incompatible_msg += '{'Do you want to activate anyway?'|@translate|@escape:'javascript'}';

{literal}
jQuery(document).ready(function() {
jQuery('.incompatible').click(function() {
return confirm(incompatible_msg);
});
});
{/literal}{/footer_script}

<div class="titrePage">
<h2>{'Plugins'|@translate}</h2>
</div>
Expand All @@ -19,6 +32,9 @@
{elseif $plugin_state == 'missing'}
{'Missing Plugins'|@translate}

{elseif $plugin_state == 'merged'}
{'Obsolete Plugins'|@translate}

{/if}
</legend>
{foreach from=$plugins item=plugin name=plugins_loop}
Expand All @@ -35,14 +51,14 @@
<a href="{$plugin.U_ACTION}&amp;action=deactivate">{'Deactivate'|@translate}</a>

{elseif $plugin_state == 'inactive'}
<a href="{$plugin.U_ACTION}&amp;action=activate">{'Activate'|@translate}</a>
<a href="{$plugin.U_ACTION}&amp;action=activate" {if $plugin.INCOMPATIBLE}class="incompatible"{/if}>{'Activate'|@translate}</a>
| <a href="{$plugin.U_ACTION}&amp;action=uninstall" onclick="return confirm('{'Are you sure?'|@translate|@escape:'javascript'}');">{'Uninstall'|@translate}</a>

{elseif $plugin_state == 'uninstalled'}
<a href="{$plugin.U_ACTION}&amp;action=install">{'Install'|@translate}</a>
| <a href="{$plugin.U_ACTION}&amp;action=delete" onclick="return confirm('{'Are you sure you want to delete this plugin?'|@translate|@escape:'javascript'}');">{'Delete'|@translate}</a>

{elseif $plugin_state == 'missing'}
{elseif $plugin_state == 'missing' or $plugin_state == 'merged'}
<a href="{$plugin.U_ACTION}&amp;action=uninstall" onclick="return confirm('{'Are you sure?'|@translate|@escape:'javascript'}');">{'Uninstall'|@translate}</a>

{/if}
Expand Down
1 change: 1 addition & 0 deletions include/common.inc.php
Expand Up @@ -156,6 +156,7 @@ function sanitize_mysql_kv(&$v, $k)
{
define('PEM_URL', 'http://'.PHPWG_DOMAIN.'/ext');
}
define('MERGED_EXTENSIONS_URL', 'http://'.PHPWG_DOMAIN.'/download/merged_extensions.txt');


// language files
Expand Down

0 comments on commit 0dd8001

Please sign in to comment.