append(new Translation(dirname($pluginFile),$i18n->languages)); // Inclusion du coeur de plugin include $pluginFile; // Gestion des css du plugin en fonction du thème actif $cssTheme = glob(dirname($pluginFile).'/*/'.$theme.'.css'); $cssDefault = glob(dirname($pluginFile).'/*/default.css'); if(isset($cssTheme[0])){ $GLOBALS['hooks']['css_files'][] = Functions::relativePath(str_replace('\\','/',dirname(__FILE__)),str_replace('\\','/',$cssTheme[0])); }else if(isset($cssDefault[0])){ $GLOBALS['hooks']['css_files'][] = Functions::relativePath(str_replace('\\','/',dirname(__FILE__)),str_replace('\\','/',$cssDefault[0])); } } } $i18n_js = $i18n->getJson(); } private static function getStates(){ $stateFile = dirname(__FILE__).Plugin::FOLDER.'/plugins.states.json'; if(!file_exists($stateFile)) touch($stateFile); return json_decode(file_get_contents($stateFile),true); } private static function setStates($states){ $stateFile = dirname(__FILE__).Plugin::FOLDER.'/plugins.states.json'; file_put_contents($stateFile,json_encode($states)); } public static function pruneStates() { $statesBefore = self::getStates(); if(empty($statesBefore)) $statesBefore = array(); $statesAfter = array(); $error = false; if (is_array($statesBefore)) { foreach($statesBefore as $file=>$state) { if (file_exists($file)) $statesAfter[$file] = $state; else $error = true; } } if ($error) self::setStates($statesAfter); } private static function getObject($pluginFile){ $plugin = new Plugin(); $fileLines = file_get_contents($pluginFile); if(preg_match_all("#@author\s(.+)\s\<(.*)\>#", $fileLines, $matches)) { foreach($matches[1] as $match) { $authors[] = trim($match); } $plugin->setAuthor($authors); foreach($matches[2] as $match) { $address[] = strtolower($match); } $plugin->setAddress($address); } if(preg_match("#@name\s(.+)[\r\n]#", $fileLines, $match)) $plugin->setName($match[1]); if(preg_match("#@licence\s(.+)[\r\n]#", $fileLines, $match)) $plugin->setLicence($match[1]); if(preg_match("#@version\s(.+)[\r\n]#", $fileLines, $match)) $plugin->setVersion($match[1]); if(preg_match("#@link\s(.+)[\r\n]#", $fileLines, $match)) $plugin->setLink(trim($match[1])); if(preg_match("#@type\s(.+)[\r\n]#", $fileLines, $match)) $plugin->setType(trim($match[1])); if(preg_match("#@description\s(.+)[\r\n]#", $fileLines, $match)) $plugin->setDescription(trim($match[1])); if(Plugin::loadState($pluginFile) || $plugin->getType()=='component'){ $plugin->setState(1); }else{ $plugin->setState(0); } $plugin->setPath($pluginFile); return $plugin; } public static function getAll(){ $pluginFiles = Plugin::getFiles(); $plugins = array(); if(is_array($pluginFiles)) { foreach($pluginFiles as $pluginFile) { $plugin = Plugin::getObject($pluginFile); $plugins[]=$plugin; } } usort($plugins, "Plugin::sortPlugin"); return $plugins; } public static function install($url) { $logger = new Logger('settings'); if(empty($url)){ $logger->appendLogs("Pas d'url renseignée."); }elseif(filter_var($url, FILTER_VALIDATE_URL) === false){ $logger->appendLogs("L'url renseignée n'est pas valide."); }else{ $logger->appendLogs('Téléchargement du plugin...'); $pluginBaseFolder = str_replace('/', '', self::FOLDER).'/'; $tempZipName = $pluginBaseFolder.md5(microtime()); file_put_contents($tempZipName,self::getUrlContent(urldecode($url))); if(file_exists($tempZipName)){ $logger->appendLogs('Plugin téléchargé
'); $logger->appendLogs('Extraction du plugin...'); $zip = new ZipArchive; $res = $zip->open($tempZipName); if ($res === TRUE) { $tempZipFolder = $tempZipName.'_'; $pluginFolder = $tempZipFolder; $zip->extractTo($tempZipFolder); $zip->close(); $logger->appendLogs('Plugin extrait '); $fi = new FilesystemIterator($tempZipFolder, FilesystemIterator::SKIP_DOTS); if(iterator_count($fi) === 1) { foreach($fi as $file){ $filename = $file->getFilename(); $pluginFolder = $pluginBaseFolder.$filename; rename($tempZipFolder.'/'.$filename, $pluginFolder); rmdir($tempZipFolder); } } $pluginName = glob($pluginFolder.'/*.plugin*.php'); if(count($pluginName)>0){ $pluginName = str_replace(array($pluginFolder.'/','.enabled','.disabled','.plugin','.php'),'',$pluginName[0]); if(!file_exists($pluginBaseFolder.$pluginName)){ $logger->appendLogs('Renommage...'); if(rename($pluginFolder,$pluginBaseFolder.$pluginName)){ $logger->appendLogs('Plugin installé, rechargez la page pour voir le plugin '); }else{ Functions::rmFullDir($pluginFolder); $logger->appendLogs('Impossible de renommer le plugin '); } }else{ $logger->appendLogs('Plugin déjà installé '); } }else{ $logger->appendLogs('Plugin invalide, fichier principal manquant '); } } else { $logger->appendLogs('Echec de l\'extraction '); } unlink($tempZipName); }else{ $logger->appendLogs('Echec du téléchargement '); } } if(Functions::isAjaxCall()){ echo json_encode($logger->getLogs(), JSON_HEX_QUOT | JSON_HEX_TAG); } else { $logger->save(); header('location: ./settings.php#pluginBloc'); } } public function getGithubMarketRepos() { header('Content-Type: application/json'); echo json_encode($this->getGithubMarketReposInfos($this->getGithubMarketReposList())); } protected function getGithubMarketReposList() { return json_decode(self::getUrlContent("https://api.github.com/orgs/Leed-market/repos?per_page=1000")); } protected function getGithubMarketReposInfos($repos) { $infos = array(); $installedPluginsNames = $this->getInstalledPluginsNames(); foreach($repos as $repo) { $repoName = $repo->name; if(!in_array(strtolower($repoName), $installedPluginsNames)) { $infos[] = array( 'name' => $repoName, 'description' => isset($repo->description) ? $repo->description : false, 'zipUrl' => 'https://github.com/'.$repo->full_name.'/archive/'.$repo->default_branch.'.zip' ); } } return $infos; } protected function getInstalledPluginsNames() { $names = array(); $installedPlugins = self::getAll(); if(!$installedPlugins || empty($installedPlugins)) { return $names; } foreach($installedPlugins as $installedPlugin) { $names[] = strtolower($installedPlugin->getName()); } return $names; } protected static function getUrlContent($url) { $timeout = 20; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true ); $datas = curl_exec($ch); curl_close($ch); return $datas; } public static function addHook($hookName, $functionName) { $GLOBALS['hooks'][$hookName][] = $functionName; } public static function addCss($css) { $bt = debug_backtrace(); $pathInfo = explode('/',dirname($bt[0]['file'])); $count = count($pathInfo); $name = $pathInfo[$count-1]; $path = '.'.Plugin::FOLDER.'/'.$name.$css; $GLOBALS['hooks']['css_files'][] = $path; } public static function callCss(){ $return=''; if(isset($GLOBALS['hooks']['css_files'])) { foreach($GLOBALS['hooks']['css_files'] as $css_file) { $return .=''."\n"; } } return $return; } public static function addLink($rel, $link, $type='', $title='') { $GLOBALS['hooks']['head_link'][] = array("rel"=>$rel, "link"=>$link, "type"=>$type, "title"=>$title); } public static function callLink(){ $return=''; if(isset($GLOBALS['hooks']['head_link'])) { foreach($GLOBALS['hooks']['head_link'] as $head_link) { $return .=''."\n"; } } return $return; } public static function path(){ $bt = debug_backtrace(); $pathInfo = explode('/',dirname($bt[0]['file'])); $count = count($pathInfo); $name = $pathInfo[$count-1]; return '.'.Plugin::FOLDER.'/'.$name.'/'; } public static function addJs($js) { $bt = debug_backtrace(); $pathInfo = explode('/',dirname($bt[0]['file'])); $count = count($pathInfo); $name = $pathInfo[$count-1]; $path = '.'.Plugin::FOLDER.'/'.$name.$js; $GLOBALS['hooks']['js_files'][] = $path; } public static function callJs(){ $return=''; if(isset($GLOBALS['hooks']['js_files'])) { foreach($GLOBALS['hooks']['js_files'] as $js_file) { $return .=''."\n"; } } return $return; } public static function callHook($hookName, $hookArguments) { //echo '