diff --git a/e107_handlers/plugin_class.php b/e107_handlers/plugin_class.php
index 30687cac3..64e80c88d 100644
--- a/e107_handlers/plugin_class.php
+++ b/e107_handlers/plugin_class.php
@@ -11,9 +11,12 @@
| GNU General Public License (http://gnu.org).
|
| $Source: /cvs_backup/e107_0.8/e107_handlers/plugin_class.php,v $
-| $Revision: 1.36 $
-| $Date: 2008-07-25 19:26:32 $
+| $Revision: 1.37 $
+| $Date: 2008-08-09 16:49:50 $
| $Author: e107steved $
+
+Mods for extra plugin.xml variables
+
+----------------------------------------------------------------------------+
*/
@@ -21,14 +24,33 @@ if (!defined('e107_INIT')) { exit; }
class e107plugin
{
- var $plugin_addons = array("e_rss", "e_notify", "e_linkgen", "e_list", "e_bb", "e_meta", "e_emailprint", "e_frontpage", "e_latest", "e_status", "e_search", "e_sc", "e_module", "e_comment", "e_sql", "e_userprofile","e_header");
+ var $plugin_addons = array(
+ "e_rss",
+ "e_notify",
+ "e_linkgen",
+ "e_list",
+ "e_bb",
+ "e_meta",
+ "e_emailprint",
+ "e_frontpage",
+ "e_latest",
+ "e_status",
+ "e_search",
+ "e_sc",
+ "e_module",
+ "e_comment",
+ "e_sql",
+ "e_userprofile",
+ "e_header"
+ );
// List of all plugin variables which need to be checked - install required if one or more set and non-empty
+ // Deprecated in 0.8 (used in plugin.php only). Probably delete in 0.9
var $all_eplug_install_variables = array(
'eplug_link_url',
'eplug_link',
'eplug_prefs',
- 'eplug_array_pref', // missing previously
+ 'eplug_array_pref',
'eplug_table_names',
'eplug_sc',
'eplug_userclass',
@@ -42,6 +64,7 @@ class e107plugin
);
// List of all plugin variables involved in an update (not used ATM, but worth 'documenting')
+ // Deprecated in 0.8 (used in plugin.php only). Probably delete in 0.9
var $all_eplug_update_variables = array (
'upgrade_alter_tables',
'upgrade_add_eplug_sc',
@@ -121,11 +144,13 @@ class e107plugin
if(!$this->parse_plugin($p['path']))
{
//parsing of plugin.php/plugin.xml failed.
- break;
+ echo "Parsing failed - file format error: {$p['path']}
";
+ continue; // Carry on and do any others that are OK
}
$plug_info = $this->plug_vars;
$plugin_path = substr(str_replace(e_PLUGIN,"",$p['path']),0,-1);
+
// scan for addons.
$eplug_addons = $this->getAddons($plugin_path); // Returns comma-separated list
// $eplug_addons = $this->getAddons($plugin_path,'check'); // Checks opening/closing tags on addon files
@@ -171,6 +196,7 @@ class e107plugin
{ // New plugin - not in table yet, so add it. If no install needed, mark it as 'installed'
if ($plug_info['name'])
{
+// echo "New plugin to add: {$plug_info['name']}
";
// Can just add to DB - shouldn't matter that its not in our current table
// echo "Trying to insert: ".$eplug_folder."
";
$_installed = ($plug_info['installRequired'] == 'true' || $plug_info['installRequired'] == 1 ? 0 : 1 );
@@ -180,7 +206,7 @@ class e107plugin
}
else
{ // May be useful that we ignore what will usually be copies/backups of plugins - but don't normally say anything
- // echo "Plugin copied to wrong directory. Is in: {$plugin_path} Should be: {$eplug_folder}
";
+// echo "Plugin copied to wrong directory. Is in: {$plugin_path} Should be: {$plug_info['folder']}
";
}
}
@@ -209,7 +235,7 @@ class e107plugin
/**
- * Returns deatils of a plugin from the plugin table from it's ID
+ * Returns details of a plugin from the plugin table from it's ID
*
* @param int $id
* @return array plugin info
@@ -235,6 +261,8 @@ class e107plugin
return $getinfo_results[$id];
}
+
+
function manage_userclass($action, $class_name, $class_description)
{
global $sql, $tp;
@@ -287,6 +315,8 @@ class e107plugin
}
}
+
+
function manage_link($action, $link_url, $link_name, $link_class=0)
{
global $sql, $tp;
@@ -331,45 +361,81 @@ class e107plugin
}
}
- function manage_prefs($action, $var)
+
+
+
+ // Update prefs array according to $action
+ // $prefType specifies the storage type - may be 'pref', 'listPref' or 'arrayPref'
+ function manage_prefs($action, $var, $prefType = 'pref', $path = '')
{
- global $pref;
- if (is_array($var))
+ global $pref;
+ if (!is_array($var)) return;
+ if (($prefType == 'arrayPref') && ($path == '')) return;
+ foreach($var as $k => $v)
+ {
+ switch ($prefType)
{
+ case 'pref' :
switch ($action)
{
- case 'add' :
- foreach($var as $k => $v)
- {
- $pref[$k] = $v;
- }
+ case 'add' :
+ $pref[$k] = $v;
break;
- case 'update' :
- foreach($var as $k => $v)
- { // Only update if $pref doesn't exist
- if (!isset($pref[$k])) $pref[$k] = $v;
- }
+ case 'update' :
+ // Only update if $pref doesn't exist
+ if (!isset($pref[$k])) $pref[$k] = $v;
break;
- case 'remove' :
- foreach($var as $k => $v)
- {
- if (is_numeric($k))
- { // Sometimes arrays specified with value being the name of the key to delete
- unset($pref[$var[$k]]);
- }
- else
- { // This is how the array should be specified - key is the name of the pref
- unset($pref[$k]);
- }
+ case 'remove' :
+ if (is_numeric($k))
+ { // Sometimes arrays specified with value being the name of the key to delete
+ unset($pref[$var[$k]]);
+ }
+ else
+ { // This is how the array should be specified - key is the name of the pref
+ unset($pref[$k]);
}
break;
}
- save_prefs();
+ break;
+ case 'listPref' :
+ $tmp = array();
+ if (isset($pref[$k])) $tmp = explode(',',$pref[$k]);
+ switch ($action)
+ {
+ case 'add' :
+ case 'update' :
+ if (!in_array($v,$tmp)) $tmp[] = $v;
+ break;
+ case 'remove' :
+ if (($tkey = array_search($v,$tmp)) !== FALSE) unset($tmp[$tkey]);
+ break;
+ }
+ $pref[$k] = implode(',',$tmp); // Leaves an empty element if no values - probably acceptable or even preferable
+ break;
+ case 'arrayPref' :
+ switch($action)
+ {
+ case 'add' :
+ $pref[$k][$path] = $v;
+ break;
+ case 'update' :
+ if (!isset($pref[$k][$path])) $pref[$k][$path] = $v;
+ break;
+ case 'remove' :
+ if (isset($pref[$k][$path])) unset($pref[$k][$path]); // Leaves an empty element if no values - probably acceptable or even preferable
+ break;
+ }
+ break;
}
+ }
+ save_prefs();
}
+
+
+
function manage_comments($action, $comment_id)
{
global $sql, $tp;
@@ -437,6 +503,9 @@ class e107plugin
}
}
+
+
+ // Handle prefs from arrays (mostly 0.7 stuff, possibly apart from the special cases)
function manage_plugin_prefs($action, $prefname, $plugin_folder, $varArray = '')
{ // These prefs are 'cumulative' - several plugins may contribute an array element
global $pref;
@@ -479,6 +548,9 @@ class e107plugin
save_prefs();
}
+
+
+
function manage_search($action, $eplug_folder)
{
global $sql, $sysprefs;
@@ -583,21 +655,25 @@ class e107plugin
$sql -> db_Update("core", "e107_value='".$s_prefs."' WHERE e107_name='notify_prefs'");
}
+
+
+ //----------------------------------------------------------
+ // Install routine for XML file
+ //----------------------------------------------------------
function manage_plugin_xml($id, $function='')
{
- global $sql;
+ global $sql, $pref;
+
+ $error = array(); // Array of error messages
+ $canContinue = TRUE; // Clear flag if must abort part way through
+
$id = (int)$id;
- $plug = $this->getinfo($id);
+ $plug = $this->getinfo($id); // Get plugin info from DB
$this->current_plug = $plug;
$txt = '';
$path = e_PLUGIN.$plug['plugin_path'].'/';
-
- $_folder = strtolower(preg_replace("#![a-zA-Z0-9]#", '', $plug['plugin_path']));
-
- //We'll just install using plugin.php file for now.
- //return $this->install_plugin_php($path);
- //New code to install using plugin.xml below.
+
$addons = explode(',', $plug['plugin_addons']);
$sql_list = array();
foreach($addons as $addon)
@@ -610,20 +686,86 @@ class e107plugin
if(!file_exists($path.'plugin.xml') || $function == '')
{
- return false;
+ $error[] = EPL_ADLAN_77;
+ $canContinue = FALSE;
}
- $error = array();
- if($this->parse_plugin_xml($path))
+ if($canContinue && $this->parse_plugin_xml($path))
{
- $plug_vars = $this->plug_vars;
+ $plug_vars = $this->plug_vars;
}
else
{
- return false;
+ $error[] = EPL_ADLAN_76;
+ $canContinue = FALSE;
}
+ // First of all, if installing or upgrading, check that any dependencies are met
+ if ($canContinue && ($function != 'uninstall') && isset($plug_vars['depends']))
+ {
+ foreach ($plug_vars['depends'] as $dt => $dv)
+ {
+ if (isset($dv['@attributes']) && isset($dv['@attributes']['name']))
+ {
+ switch ($dt)
+ {
+ case 'plugin' :
+// echo "Check plugin dependency: {$dv['@attributes']['name']} version {$dv['@attributes']['min_version']}
";
+ if (!isset($pref['plug_installed'][$dv['@attributes']['name']]))
+ { // Plugin not installed
+ $canContinue = FALSE;
+ $error[] = EPL_ADLAN_70.$dv['@attributes']['name'];
+ }
+ elseif (isset($dv['@attributes']['min_version']) && (version_compare($dv['@attributes']['min_version'],$pref['plug_installed'][$dv['@attributes']['name']],'<=') === FALSE))
+ {
+ $error[] = EPL_ADLAN_71.$dv['@attributes']['name'].EPL_ADLAN_72.$dv['@attributes']['min_version'];
+ $canContinue = FALSE;
+ }
+ break;
+ case 'extension' :
+ if (!extension_loaded($dv['@attributes']['name']))
+ {
+ $canContinue = FALSE;
+ $error[] = EPL_ADLAN_73.$dv['@attributes']['name'];
+ }
+ elseif (isset($dv['@attributes']['min_version']) && (version_compare($dv['@attributes']['min_version'],phpversion($dv['@attributes']['name']),'<=') === FALSE))
+ {
+ $error[] = EPL_ADLAN_71.$dv['@attributes']['name'].EPL_ADLAN_72.$dv['@attributes']['min_version'];
+ $canContinue = FALSE;
+ }
+ break;
+ case 'PHP' :
+ if (isset($dv['@attributes']['min_version']) && (version_compare($dv['@attributes']['min_version'],phpversion(),'<=') === FALSE))
+ {
+ $error[] = EPL_ADLAN_74.$dv['@attributes']['min_version'];
+ $canContinue = FALSE;
+ }
+ break;
+ case 'MySQL' :
+ if (isset($dv['@attributes']['min_version']) && (version_compare($dv['@attributes']['min_version'],mysql_get_server_info(),'<=') === FALSE))
+ {
+ $error[] = EPL_ADLAN_75.$dv['@attributes']['min_version'];
+ $canContinue = FALSE;
+ }
+ break;
+ default :
+ echo "Unknown dependency: {$dt}
";
+ }
+ }
+ }
+ }
+
+ // Temporary error handling - need to do something with this
+ if (!$canContinue)
+ {
+ echo implode('
',$error);
+ return false;
+ }
+
+
+ // All the dependencies are OK - can start the install now
+
// Let's call any custom pre functions defined in section
$txt .= $this->execute_function($path, $function, 'pre');
@@ -671,8 +813,8 @@ class e107plugin
$attrib = $link['@attributes'];
switch($function)
{
- case 'upgrade':
- case 'install':
+ case 'upgrade':
+ case 'install':
// Add any active link
if(!isset($attrib['active']) || $attrib['active'] == 'true')
{
@@ -688,7 +830,7 @@ class e107plugin
}
break;
- case 'uninstall':
+ case 'uninstall':
//remove all links
$txt .= "Removing link {$attrib['name']} with url [{$attrib['url']}]
";
$this->manage_link('remove', $attrib['url'], $attrib['name']);
@@ -700,37 +842,46 @@ class e107plugin
//main pref items
if(isset($plug_vars['mainPrefs']))
{
- if(isset($plug_vars['mainPrefs']['pref']))
+ foreach (array('pref','listPref','arrayPref') as $prefType)
+ {
+ if(isset($plug_vars['mainPrefs'][$prefType]))
{
- $list = $this->parse_prefs($plug_vars['mainPrefs']['pref']);
- switch($function)
- {
- case 'install':
- case 'upgrade':
+ $list = $this->parse_prefs($plug_vars['mainPrefs'][$prefType]);
+ switch($function)
+ {
+ case 'install':
if(is_array($list['active']))
{
- $txt .= "Adding prefs ".print_a($list['active'], true)."
";
- $this->manage_prefs('add', $list['active']);
+ $txt .= "Adding {$prefType} prefs ".print_a($list['active'], true)."
";
+ $this->manage_prefs('add', $list['active'], $prefType, $plug['plugin_path']);
+ }
+ break;
+ case 'upgrade':
+ if(is_array($list['active']))
+ {
+ $txt .= "Updating {$prefType} prefs ".print_a($list['active'], true)."
";
+ $this->manage_prefs('update', $list['active'], $prefType, $plug['plugin_path']); // This only adds prefs which aren't already defined
}
//If upgrading, removing any inactive pref
- if($function == 'upgrade' && is_array($list['inactive']))
+ if(is_array($list['inactive']))
{
- $txt .= "Removing prefs ".print_a($list['inactive'], true)."
";
- $this->manage_prefs('remove', $list['inactive']);
+ $txt .= "Removing {$prefType} prefs ".print_a($list['inactive'], true)."
";
+ $this->manage_prefs('remove', $list['inactive'], $prefType, $plug['plugin_path']);
}
break;
//If uninstalling, remove all prefs (active or inactive)
- case 'uninstall':
+ case 'uninstall':
if(is_array($list['all']))
{
- $txt .= "Removing prefs ".print_a($list['all'], true)."
";
- $this->manage_prefs('remove', $list['all']);
+ $txt .= "Removing {$prefType} prefs ".print_a($list['all'], true)."
";
+ $this->manage_prefs('remove', $list['all'], $prefType, $plug['plugin_path']);
}
break;
- }
+ }
}
+ }
}
//Userclasses
@@ -769,7 +920,7 @@ class e107plugin
}
}
- //If and commentIDs are configured, we need to remove all comments on uninstall
+ //If any commentIDs are configured, we need to remove all comments on uninstall
if($function == 'uninstall' && isset($plug_vars['commentID']))
{
$commentArray = (is_array($plug_vars['commentID']) ? $plug_vars['commentID'] : array($plug_vars['commentID']));
@@ -779,7 +930,42 @@ class e107plugin
$this->manage_search($function, $plug_vars['folder']);
$this->manage_notify($function, $plug_vars['folder']);
-
+
+
+ // Now any 'custom' values for update, language file definitions etc
+ if (isset($plug_vars['management']['upgradeCheck']))
+ {
+ $tmp = $plug_vars['management']['upgradeCheck'];
+ switch ($function)
+ {
+ case 'install' :
+ case 'upgrade' :
+ $pref['upgradeCheck'][$plug['plugin_path']]['url'] = $tmp['@attributes']['url'];
+ $pref['upgradeCheck'][$plug['plugin_path']]['method'] = varset($tmp['@attributes']['method'],'sf_news');
+ break;
+ case 'uninstall' :
+ unset($pref['upgradeCheck'][$plug['plugin_path']]);
+ break;
+ }
+ unset($tmp);
+ }
+
+ if (isset($plug_vars['logLanguageFile']))
+ {
+ switch ($function)
+ {
+ case 'install' :
+ case 'upgrade' :
+ $pref['logLanguageFile'][$plug['plugin_path']] = $plug_vars['logLanguageFile']['@attributes']['filename'];
+ break;
+ case 'uninstall' :
+ unset($pref['logLanguageFile'][$plug['plugin_path']]);
+ break;
+ }
+ }
+ save_prefs();
+
+
// Let's call any custom post functions defined in section
$txt .= $this->execute_function($path, $function, 'post');
@@ -796,6 +982,8 @@ class e107plugin
if($function == 'uninstall')
{
$sql->db_Update('plugin', "plugin_installflag = 0, plugin_addons = '{$eplug_addons}', plugin_version = '{$plug_vars['version']}' WHERE plugin_id = ".$id);
+ unset($pref['plug_installed'][$plug['plugin_path']]);
+ save_prefs();
}
if($function == 'install')
@@ -1178,6 +1366,7 @@ class e107plugin
}
+ // Entry point to read plugin configuration data
function parse_plugin($path, $force=false)
{
if(isset($this->parsed_plugin[$path]) && $force != true)
@@ -1200,6 +1389,8 @@ class e107plugin
return $ret;
}
+
+ // Called to parse the (deprecated) plugin.php file
function parse_plugin_php($path)
{
include($path.'plugin.php');
@@ -1230,6 +1421,9 @@ class e107plugin
return true;
}
+
+
+ // Called to parse the plugin.xml file if it exists
function parse_plugin_xml($path)
{
global $tp;
@@ -1238,6 +1432,7 @@ class e107plugin
require_once(e_HANDLER.'xml_class.php');
$xml = new xmlClass;
$this->plug_vars = $xml->loadXMLfile($path.'plugin.xml', true, true);
+ if ($this->plug_vars === FALSE) return FALSE;
// print_a($this->plug_vars);
// $xml->loadXMLfile($path.'plugin.xml', true, true);
// $xml->xmlFileContents = $tp->replaceConstants($xml->xmlFileContents, '', true);
diff --git a/e107_languages/English/admin/lan_plugin.php b/e107_languages/English/admin/lan_plugin.php
index 1b2343444..8611adb1d 100644
--- a/e107_languages/English/admin/lan_plugin.php
+++ b/e107_languages/English/admin/lan_plugin.php
@@ -4,9 +4,9 @@
| e107 website system - Language File.
|
| $Source: /cvs_backup/e107_0.8/e107_languages/English/admin/lan_plugin.php,v $
-| $Revision: 1.4 $
-| $Date: 2008-02-13 02:58:58 $
-| $Author: mcfly_e107 $
+| $Revision: 1.5 $
+| $Date: 2008-08-09 16:49:58 $
+| $Author: e107steved $
+----------------------------------------------------------------------------+
*/
define("EPL_ADLAN_0", "Install");
@@ -86,6 +86,19 @@ define("EPL_ADLAN_62", "Cancel uninstall");
define("EPL_ADLAN_63", "Uninstall:");
define("EPL_ADLAN_64", "Folder:");
+define ('EPL_ADLAN_70','Required plugin not installed: ');
+define ('EPL_ADLAN_71','Newer plugin version required: ');
+define ('EPL_ADLAN_72',' Version: ');
+define ('EPL_ADLAN_73','Required PHP extension not loaded: ');
+define ('EPL_ADLAN_74','Newer PHP version required: ');
+define ('EPL_ADLAN_75','Newer MySQL version required: ');
+define ('EPL_ADLAN_76','Error in plugin.xml');
+define ('EPL_ADLAN_77','Cannot find plugin.xml');
+define ('EPL_ADLAN_78','');
+define ('EPL_ADLAN_79','');
+define ('EPL_ADLAN_80','');
+
+
define("LAN_UPGRADE_SUCCESSFUL", "Upgrade Successful");
define("LAN_INSTALL_SUCCESSFUL", "Installation Successful");