. * */ class OC_PLUGIN{ static private $blacklist=array(); /** * load the plugin with the given id * @param string id * @return bool */ static public function load($id){ global $SERVERROOT; $data=self::getPluginData($id); if($data){ if(isset($data['info']['require'])){ $minVersion=explode('.',$data['info']['require']); $version=OC_UTIL::getVersion(); $roundTo=count($minVersion); while(count($version)>$roundTo){ if($version[count($version)-1]>=50){ $version[count($version)-2]++; } unset($version[count($version)-1]); } for($i=0;$i'.' AND $filename<>'..' AND ('.' != substr($filename, 0, 1))) { if(file_exists($SERVERROOT . '/plugins/'.$filename.'/plugin.xml')){ $plugins[]=$filename; } } } closedir($fd); return $plugins; } /** * Load all plugins that aren't blacklisted */ public static function loadPlugins() { global $CONFIG_INSTALLED; if($CONFIG_INSTALLED){ global $SERVERROOT; $plugins = self::listPlugins(); $blacklist=self::loadBlacklist(); foreach($plugins as $plugin){ if (array_search($plugin,$blacklist)===false) { self::load($plugin); } } } } /** * load the blacklist from blacklist.txt * @return array */ public static function loadBlacklist(){ global $SERVERROOT; if(count(self::$blacklist)>0){ return self::$blacklist; } $blacklist=array(); if(is_file($SERVERROOT.'/plugins/blacklist.txt')){ $file=file_get_contents($SERVERROOT.'/plugins/blacklist.txt'); $lines=explode("\n",$file); foreach($lines as $line){ $id=trim($line); if($id!='' and is_dir($SERVERROOT.'/plugins/'.$id)){ $blacklist[]=$id; } } } self::$blacklist=$blacklist; return $blacklist; } /** * save a blacklist to blacklist.txt * @param array blacklist */ private static function saveBlacklist($blacklist){ global $SERVERROOT; $file=''; foreach($blacklist as $item){ $file.="$item\n"; } self::$blacklist=$blacklist; file_put_contents($SERVERROOT.'/plugins/blacklist.txt',$file); } /** * add a plugin to the blacklist * @param string id */ public static function addToBlacklist($id){ $blacklist=self::loadBlacklist(); if(array_search($id,$blacklist)===false){ $blacklist[]=$id; self::$blacklist=$blacklist; self::saveBlacklist($blacklist); } } /** * remove a plugin to the blacklist * @param string id */ public static function removeFromBlacklist($id){ $blacklist=self::loadBlacklist(); $index=array_search($id,$blacklist); if($index!==false){ unset($blacklist[$index]); self::$blacklist=$blacklist; self::saveBlacklist($blacklist); } } /** * Load data from the plugin.xml of a plugin, either identified by the plugin or the path of the plugin.xml file * @param string id * @return array */ public static function getPluginData($id){ global $SERVERROOT; if(is_file($id)){ $file=$id; }else{ if(!is_dir($SERVERROOT.'/plugins/'.$id) or !is_file($SERVERROOT.'/plugins/'.$id.'/plugin.xml')){ return false; }else{ $file=$SERVERROOT.'/plugins/'.$id.'/plugin.xml'; } } $data=array(); $plugin=new DOMDocument(); $plugin->load($file); $data['version']=$plugin->documentElement->getAttribute('version'); $info=$plugin->getElementsByTagName('info'); if($info->length>0){ $info=$info->item(0); $data['info']=array(); foreach($info->childNodes as $child){ if($child->nodeType==XML_ELEMENT_NODE){ $data['info'][$child->tagName]=$child->textContent; } } } $runtime=$plugin->getElementsByTagName('runtime'); if($runtime->length>0){ $runtime=$runtime->item(0); $data['runtime']=array(); foreach($runtime->childNodes as $child){ if($child->nodeType==XML_ELEMENT_NODE and $child->tagName=='include'){ $data['runtime'][]=$child->textContent; } } } $install=$plugin->getElementsByTagName('install'); if($install->length>0){ $install=$install->item(0); $data['install']=array(); foreach($install->childNodes as $child){ if($child->nodeType==XML_ELEMENT_NODE){ $data['install']['include']=array(); $data['install']['dialog']=array(); $data['install']['database']=array(); switch($child->tagName){ case 'include': $data['install']['include'][]=$child->textContent; break; case 'dialog': $data['install']['dialog'][]=$child->textContent; break; case 'database': $data['install']['database'][]=$child->textContent; $data['install']['database_installed'][$child->textContent]=($child->hasAttribute('installed') and $child->getAttribute('installed')=='true')?true:false; break; } } } } $uninstall=$plugin->getElementsByTagName('uninstall'); if($uninstall->length>0){ $uninstall=$uninstall->item(0); $data['uninstall']=array(); foreach($uninstall->childNodes as $child){ if($child->nodeType==XML_ELEMENT_NODE){ $data['uninstall']['include']=array(); $data['uninstall']['dialog']=array(); switch($child->tagName){ case 'include': $data['uninstall']['include'][]=$child->textContent; break; case 'dialog': $data['uninstall']['dialog'][]=$child->textContent; break; } } } } return $data; } /** * Save data to the plugin.xml of a plugin, either identified by the plugin or the path of the plugin.xml file * @param string id * @param array data the plugin data in the same structure as returned by getPluginData * @return bool */ public static function savePluginData($id,$data){ global $SERVERROOT; if(is_file($id)){ $file=$id; } if(!is_dir($SERVERROOT.'/plugins/'.$id) or !is_file($SERVERROOT.'/plugins/'.$id.'/plugin.xml')){ return false; }else{ $file=$SERVERROOT.'/plugins/'.$id.'/plugin.xml'; } $plugin=new DOMDocument(); $pluginNode=$plugin->createElement('plugin'); $pluginNode->setAttribute('version',$data['version']); $plugin->appendChild($pluginNode); $info=$plugin->createElement('info'); foreach($data['info'] as $name=>$value){ $node=$plugin->createElement($name); $node->appendChild($plugin->createTextNode($value)); $info->appendChild($node); } $pluginNode->appendChild($info); if(isset($data['runtime'])){ $runtime=$plugin->createElement('runtime'); foreach($data['runtime'] as $include){ $node=$plugin->createElement('include'); $node->appendChild($plugin->createTextNode($include)); $runtime->appendChild($node); } $pluginNode->appendChild($runtime); } if(isset($data['install'])){ $install=$plugin->createElement('install'); foreach($data['install']['include'] as $include){ $node=$plugin->createElement('include'); $node->appendChild($plugin->createTextNode($include)); $install->appendChild($node); } foreach($data['install']['dialog'] as $dialog){ $node=$plugin->createElement('dialog'); $node->appendChild($plugin->createTextNode($dialog)); $install->appendChild($node); } foreach($data['install']['database'] as $database){ $node=$plugin->createElement('database'); $node->appendChild($plugin->createTextNode($database)); if($data['install']['database_installed'][$database]){ $node->setAttribute('installed','true'); } $install->appendChild($node); } $pluginNode->appendChild($install); } if(isset($data['uninstall'])){ $uninstall=$plugin->createElement('uninstall'); foreach($data['uninstall']['include'] as $include){ $node=$plugin->createElement('include'); $node->appendChild($plugin->createTextNode($include)); $uninstall->appendChild($node); } foreach($data['uninstall']['dialog'] as $dialog){ $node=$plugin->createElement('dialog'); $node->appendChild($plugin->createTextNode($dialog)); $uninstall->appendChild($node); } $pluginNode->appendChild($uninstall); } $plugin->save($file); } /** * install the databases of a plugin * @param string id * @return bool */ public static function installDB($id){ global $SERVERROOT; $data=OC_PLUGIN::getPluginData($id); foreach($data['install']['database'] as $db){ if (!$data['install']['database_installed'][$db]){ $file=$SERVERROOT.'/plugins/'.$id.'/'.$db; OC_DB::createDbFromStructure($file); $data['install']['database_installed'][$db]=true; } } self::savePluginData($id,$data); return true; } public static function installPlugin($path){ global $SERVERROOT; if(is_file($path)){ $zip = new ZipArchive; if($zip->open($path)===TRUE){ $folder=sys_get_temp_dir().'/OC_PLUGIN_INSTALL/'; mkdir($folder); $zip->extractTo($folder); if(is_file($folder.'/plugin.xml')){ $pluginData=self::getPluginData($folder.'/plugin.xml'); if(array_search($pluginData['info']['id'],self::listPlugins())===false){ if(isset($pluginData['install'])){ foreach($pluginData['install']['database'] as $db){ OC_DB::createDbFromStructure($folder.'/'.$db); $pluginData['install']['database_installed'][$db]=true; } foreach($pluginData['install']['include'] as $include){ include($folder.'/'.$include); } } recursive_copy($folder,$SERVERROOT.'/plugins/'.$pluginData['info']['id']); self::savePluginData($SERVERROOT.'/plugins/'.$pluginData['info']['id'].'/plugin.xml',$pluginData); } } delTree($folder); } } } } ?>