芝麻web文件管理V1.00
编辑当前文件:/home/p/r/i/prismawe/clients/canaldegap.fr/lib/classes/class.moduleoperations.inc.php
]>'; /** * ------------------------------------------------------------------ * Error Functions * ------------------------------------------------------------------ */ /** * Set an error condition */ function SetError($str = '') { global $gCms; $gCms->variables['error'] = $str; } /** * Return the last error */ function GetLastError() { global $gCms; if( isset( $gCms->variables['error'] ) ) return $gCms->variables['error']; return ""; } /** * Creates an xml data package from the module directory. */ function CreateXMLPackage( &$modinstance, &$message, &$filecount ) { // get a file list $filecount = 0; $dir = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR."modules".DIRECTORY_SEPARATOR.$modinstance->GetName(); $files = get_recursive_file_list( $dir, $this->xml_exclude_files ); $xmltxt = ''; $xmltxt .= $this->xmldtd."\n"; $xmltxt .= "
\n"; $xmltxt .= "
".MODULE_DTD_VERSION."
\n"; $xmltxt .= "
".$modinstance->GetName()."
\n"; $xmltxt .= "
".$modinstance->GetVersion()."
\n"; $xmltxt .= "
".$modinstance->MinimumCMSVersion()."
\n"; $xmltxt .= "
".base64_encode($modinstance->GetHelpPage())."
\n"; $xmltxt .= "
".base64_encode($modinstance->GetAbout())."
\n"; $desc = $modinstance->GetAdminDescription(); if( $desc != '' ) { $xmltxt .= "
".$desc."
\n"; } $depends = $modinstance->GetDependencies(); foreach( $depends as $key=>$val ) { $xmltxt .= "
\n"; $xmltxt .= "
$key
\n"; $xmltxt .= "
$val
\n"; $xmltxt .= "
\n"; } foreach( $files as $file ) { // strip off the beginning if (substr($file,0,strlen($dir)) == $dir) { $file = substr($file,strlen($dir)); } if( $file == '' ) continue; $xmltxt .= "
\n"; $filespec = $dir.DIRECTORY_SEPARATOR.$file; $xmltxt .= "
$file
\n"; if( @is_dir( $filespec ) ) { $xmltxt .= "
1
\n"; } else { $xmltxt .= "
0
\n"; $data = base64_encode(file_get_contents($filespec)); $xmltxt .= "
\n"; } $xmltxt .= "
\n"; ++$filecount; } $xmltxt .= "
\n"; $message = 'XML package of '.strlen($xmltxt).' bytes created for '.$modinstance->GetName(); $message .= ' including '.$filecount.' files'; return $xmltxt; } /** * Unpackage a module from an xml string * does not touch the database */ function ExpandXMLPackage( $xml, $overwrite = 0, $brief = 0 ) { global $gCms; // first make sure that we can actually write to the module directory $dir = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR."modules"; if( !is_writable( $dir ) && $brief == 0 ) { // directory not writable ModuleOperations::SetError( lang( 'errordirectorynotwritable' ) ); return false; } // start parsing xml $parser = xml_parser_create(); $ret = xml_parse_into_struct( $parser, $xml, $val, $xt ); xml_parser_free( $parser ); if( $ret == 0 ) { ModuleOperations::SetError( lang( 'errorcouldnotparsexml' ) ); return false; } ModuleOperations::SetError( "" ); $havedtdversion = false; $moduledetails = array(); $moduledetails['size'] = strlen($xml); $required = array(); foreach( $val as $elem ) { $value = (isset($elem['value'])?$elem['value']:''); $type = (isset($elem['type'])?$elem['type']:''); switch( $elem['tag'] ) { case 'NAME': { if( $type != 'complete' && $type != 'close' ) { continue; } // check if this module is already installed if( isset( $gCms->modules[$value] ) && $overwrite == 0 && $brief == 0 ) { ModuleOperations::SetError( lang( 'moduleinstalled' ) ); return false; } $moduledetails['name'] = $value; break; } case 'DTDVERSION': { if( $type != 'complete' && $type != 'close' ) { continue; } if( $value != MODULE_DTD_VERSION ) { ModuleOperations::SetError( lang( 'errordtdmismatch' ) ); return false; } $havedtdversion = true; break; } case 'VERSION': { if( $type != 'complete' && $type != 'close' ) { continue; } $moduledetails['version'] = $value; if( isset( $gCms->modules[$moduledetails['name']] ) ) { $version = $gCms->modules[$moduledetails['name']]['object']->GetVersion(); if( version_compare($moduledetails['version'],$version) < 0 && $brief == 0) { ModuleOperations::SetError( lang('errorattempteddowngrade') ); return false; } else if (version_compare($moduledetails['version'],$version) == 0 && $brief == 0 ) { ModuleOperations::SetError( lang('moduleinstalled') ); return false; } } break; } case 'MINCMSVERSION': { if( $type != 'complete' && $type != 'close' ) { continue; } $moduledetails['mincmsversion'] = $value; break; } case 'MAXCMSVERSION': { if( $type != 'complete' && $type != 'close' ) { continue; } $moduledetails['maxcmsversion'] = $value; break; } case 'DESCRIPTION': { if( $type != 'complete' && $type != 'close' ) { continue; } $moduledetails['description'] = $value; break; } case 'HELP': { if( $type != 'complete' && $type != 'close' ) { continue; } $moduledetails['help'] = base64_decode($value); break; } case 'ABOUT': { if( $type != 'complete' && $type != 'close' ) { continue; } $moduledetails['about'] = base64_decode($value); break; } case 'REQUIRES': { if( $type != 'complete' && $type != 'close' ) { continue; } if( count($requires) != 2 ) { continue; } if( !isset( $moduledetails['requires'] ) ) { $moduledetails['requires'] = array(); } $moduledetails['requires'][] = $requires; $requires = array(); } case 'REQUIREDNAME': $requires['name'] = $value; break; case 'REQUIREDVERSION': $requires['version'] = $value; break; case 'FILE': { if( $type != 'complete' && $type != 'close' ) { continue; } if( $brief != 0 ) { continue; } // finished a first file if( !isset( $moduledetails['name'] ) || !isset( $moduledetails['version'] ) || !isset( $moduledetails['filename'] ) || !isset( $moduledetails['isdir'] ) ) { print_r( $moduledetails ); ModuleOperations::SetError( lang('errorincompletexml') ); return false; } // ready to go $moduledir=$dir.DIRECTORY_SEPARATOR.$moduledetails['name']; $filename=$moduledir.$moduledetails['filename']; if( !file_exists( $moduledir ) ) { if( !@mkdir( $moduledir ) && !is_dir( $moduledir ) ) { ModuleOperations::SetError(lang('errorcantcreatefile').' '.$moduledir); break; } } else if( $moduledetails['isdir'] ) { if( !@mkdir( $filename ) && !is_dir( $filename ) ) { ModuleOperations::SetError(lang('errorcantcreatefile').' '.$filename); break; } } else { $data = $moduledetails['filedata']; if( strlen( $data ) ) { $data = base64_decode( $data ); } $fp = @fopen( $filename, "w" ); if( !$fp ) { ModuleOperations::SetError(lang('errorcantcreatefile').' '.$filename); } if( strlen( $data ) ) { @fwrite( $fp, $data ); } @fclose( $fp ); } unset( $moduledetails['filedata'] ); unset( $moduledetails['filename'] ); unset( $moduledetails['isdir'] ); } case 'FILENAME': $moduledetails['filename'] = $value; break; case 'ISDIR': $moduledetails['isdir'] = $value; break; case 'DATA': if( $type != 'complete' && $type != 'close' ) { continue; } $moduledetails['filedata'] = $value; break; } } // foreach if( $havedtdversion == false ) { ModuleOperations::SetError( lang( 'errordtdmismatch' ) ); } // we've created the module's directory unset( $moduledetails['filedata'] ); unset( $moduledetails['filename'] ); unset( $moduledetails['isdir'] ); if( ModuleOperations::GetLastError() != "" ) { return false; } return $moduledetails; } /** * Install a module into the database */ function InstallModule($module, $loadifnecessary = false) { global $gCms; if( !isset( $gCms->modules[$module] ) ) { if( $loadifnecessary == false ) { return array(false,lang('errormodulenotloaded')); } else { if( !ModuleOperations::LoadNewModule( $module ) ) { return array(false,lang('errormodulewontload')); } } } $db =& $gCms->GetDb(); if (isset($gCms->modules[$module])) { $modinstance =& $gCms->modules[$module]['object']; $result = $modinstance->Install(); #now insert a record if (!isset($result) || $result === FALSE) { $query = "INSERT INTO ".cms_db_prefix()."modules (module_name, version, status, admin_only, active) VALUES (?,?,'installed',?,?)"; $db->Execute($query, array($module,$modinstance->GetVersion(),($modinstance->IsAdminOnly()==true?1:0),1)); #and insert any dependancies if (count($modinstance->GetDependencies()) > 0) #Check for any deps { #Now check to see if we can satisfy any deps foreach ($modinstance->GetDependencies() as $onedepkey=>$onedepvalue) { $time = $db->DBTimeStamp(time()); $query = "INSERT INTO ".cms_db_prefix()."module_deps (parent_module, child_module, minimum_version, create_date, modified_date) VALUES (?,?,?,".$time.",".$time.")"; $db->Execute($query, array($onedepkey, $module, $onedepvalue)); } } #send an event saying the module has been installed Events::SendEvent('Core', 'ModuleInstalled', array('name' => &$module, 'version' => $modinstance->GetVersion())); // and we're done return array(true); } else { if( trim($result) == "" ) { $result = lang('errorinstallfailed'); } return array(false,$result); } } else { return array(false,lang('errormodulenotfound')); } } /** * Load a single module from the filesystem */ function LoadNewModule( $modulename ) { global $gCms; $db =& $gCms->GetDb(); $cmsmodules = &$gCms->modules; $dir = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR."modules"; if (@is_file("$dir/$modulename/$modulename.module.php")) { // question: is this a potential XSS vulnerability include("$dir/$modulename/$modulename.module.php"); if( !class_exists( $modulename ) ) { return false; } $newmodule =& new $modulename; $name = $newmodule->GetName(); $cmsmodules[$name]['object'] =& $newmodule; $cmsmodules[$name]['installed'] = false; $cmsmodules[$name]['active'] = false; } else { unset($cmsmodules[$modulename]); return false; } return true; } /** * Upgrade a module */ function UpgradeModule( $module, $oldversion, $newversion ) { global $gCms; $db =& $gCms->GetDb(); if (!isset($gCms->modules[$module])) { return false; } $modinstance = $gCms->modules[$module]['object']; $result = $modinstance->Upgrade($oldversion, $newversion); if( $result === FALSE ) { return false; } $query = "UPDATE ".cms_db_prefix()."modules SET version = ?, admin_only = ? WHERE module_name = ?"; $db->Execute($query,array($newversion,($modinstance->IsAdminOnly()==true?1:0),$module)); Events::SendEvent('Core', 'ModuleUpgraded', array('name' => $module, 'oldversion' => $oldversion, 'newversion' => $oldversion)); return true; } /** * Returns a hash of all loaded modules. This will include all * modules loaded by LoadModules, which could either be all or them, * or just ones that are active and installed. */ function & GetAllModules() { global $gCms; $cmsmodules = &$gCms->modules; return $cmsmodules; } }