diff options
Diffstat (limited to 'lib/plugin.php')
-rw-r--r-- | lib/plugin.php | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/lib/plugin.php b/lib/plugin.php new file mode 100644 index 00000000000..0cec329ea35 --- /dev/null +++ b/lib/plugin.php @@ -0,0 +1,381 @@ +<?php + +/** +* ownCloud +* +* @author Frank Karlitschek +* @copyright 2010 Frank Karlitschek karlitschek@kde.org +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Affero General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +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<count($minVersion);$i++){ + if($version[$i]<$minVersion[$i]){ + return false; + } + } + } + //check for uninstalled db's + if(isset($data['install']) and isset($data['install']['database'])){ + foreach($data['install']['database'] as $db){ + if(!$data['install']['database_installed'][$db]){ + self::installDB($id); + break; + } + } + } + + if(isset($data['runtime'])){ + foreach($data['runtime'] as $include){ + include($SERVERROOT.'/plugins/'.$id.'/'.$include); + } + } + } + return false; + } + + /** + * Get a list of all installed plugins + */ + public static function listPlugins() { + global $SERVERROOT; + $plugins = array(); + $fd = opendir($SERVERROOT . '/plugins'); + while ( false !== ($filename = readdir($fd)) ) { + if ( $filename<>'.' 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); + } + } + } +} +?> |