Extension PHP curl absente, ce script ne fonctionnera pas sur votre hébergement !';} $latest_version= ''; if($curl == true) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, 'https://pluxml.org/download/latest-version.txt'); $latest_version = 'Version '.curl_exec($ch).'';; $info = curl_getinfo($ch); if ($latest_version === false || $info['http_code'] != 200) { $latest_version = ''; } curl_close($ch); } function is_RemoteFileExists($remotefile) { return true; $curl = curl_init($remotefile); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_FAILONERROR, true); curl_setopt($curl, CURLOPT_HTTPHEADER, Array("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15") ); // request as if Firefox curl_setopt($curl, CURLOPT_NOBODY, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, false); $connectable = curl_exec($curl); curl_close($curl); return $connectable; } function downloadRemoteFile($remotefile, $destination,$VerifyPeer=false,$VerifyHost=true) { if($fp = fopen($destination, 'w')) { $curl = curl_init($remotefile); curl_setopt($curl, CURLOPT_FILE, $fp); curl_setopt($curl, CURLOPT_HEADER, 0); # we are not sending any headers curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_redir_exec($curl); curl_close($curl); fclose($fp); } else return false; return (is_file($destination) AND filesize($destination)>0); } function curl_redir_exec(/*resource*/ $ch, /*int*/ &$maxredirect = null) { $mr = $maxredirect === null ? 5 : intval($maxredirect); if (ini_get('open_basedir') == '') { curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0); curl_setopt($ch, CURLOPT_MAXREDIRS, $mr); } else { curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); if ($mr > 0) { $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); $rch = curl_copy_handle($ch); curl_setopt($rch, CURLOPT_HEADER, true); curl_setopt($rch, CURLOPT_NOBODY, true); curl_setopt($rch, CURLOPT_FORBID_REUSE, false); curl_setopt($rch, CURLOPT_RETURNTRANSFER, true); do { curl_setopt($rch, CURLOPT_URL, $newurl); $header = curl_exec($rch); if (curl_errno($rch)) { $code = 0; } else { $code = curl_getinfo($rch, CURLINFO_HTTP_CODE); if ($code == 301 || $code == 302) { preg_match('/Location:(.*?)\\n/', $header, $matches); $newurl = trim(array_pop($matches)); } else { $code = 0; } } } while ($code && --$mr); curl_close($rch); if (!$mr) { if ($maxredirect === null) { trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING); } else { $maxredirect = 0; } return false; } curl_setopt($ch, CURLOPT_URL, $newurl); } } return curl_exec($ch); } function ini_get_boolean($setting) { $my_boolean = ini_get($setting); if ((int) $my_boolean > 0) $my_boolean = true; else { $my_lowered_boolean = strtolower($my_boolean); if ($my_lowered_boolean === "true" || $my_lowered_boolean === "on" || $my_lowered_boolean === "yes") $my_boolean = true; else $my_boolean = false; } return $my_boolean; } function upmove() { # final step $sources = browseFolder(ROOT); $offset = strlen(WORKDIR.'/'.ROOT) - 1; foreach($sources as $src) { rename($src, WORKDIR.substr($src, $offset)); } rmdir(WORKDIR.'/'.ROOT);} function deleteTemp($path='tmp') { return is_file($path) ? @unlink($path) : array_map(__FUNCTION__, glob($path.'/{*,.htaccess,.git*}', GLOB_BRACE + GLOB_NOESCAPE)) == @rmdir($path); } $plugAvalaible = json_decode(file_get_contents($plugXml), true); $selectedPlugins= '/* multilingue */, plxMyMultiLingue, /* SEO alike widgets */, AlireEgalement, extra_SEO, tagOptions, plxMySearch, plxMyBetterUrl, /* interaction webmestre visiteurs */, plxMyContact, vip_zone, markdownComment, SignUp, StaticComments, StaticMiniForum, /* editeur */, plxeditor, SunEditor, /* front widgets */, addEvents, ArticleBackslashesKeeper, CookieMessage, Galart, plxResponsiveSlidesJs, plxScrollToTop, modules, /* admin widgets */, Pexels, kzOtPHP, Bannip, ModerationList, /* utilitaires */, commentTimer, highlightJS, lockArticles, myDownloads, '; $plugs=''; # on recupére la selection depuis ressources.pluxopolis.net if(is_array($plugAvalaible) && $plugAvalaible['plugins']>0){ $plugArray= explode(',',$selectedPlugins); natcasesort($plugArray); foreach($plugArray as $plug => $name) { if(isset($plugAvalaible['plugins'][trim($name)])) { $plugs .= '

'; } } } $themesAvalaible = json_decode(file_get_contents($themeXml), true); # selection arbitraire d'archives de thèmes existantes sur pluxthèmes. $selectedThemes='11-05-24,Bounce,bs5-Blog,bs5BigBlog,CleanBlog2,hesitationblues,keepItSimple,pluxshow,scifist,wheatwheat,newYork,kzBasic,Colors,duena,lightNdark,monospaceBlog,myPlxDefaut-enhanced-grid,flat,HolyGrail-3col'; $themeList=''; # on récupére les infos des thèmes depuis pluxthèmes. if(is_array($themesAvalaible) && count($themesAvalaible)>0){ $themesArray =explode(',', $selectedThemes); foreach($themesArray as $theme => $name) { if(isset($themesAvalaible[trim($name)]['archive'])) $themeList .=' '.PHP_EOL; //echo $themesAvalaible[trim($name)]['title'].'NOM
'; } $themeList = '

'; } // 22/03/2013 (v2.67) // - New method: ->each(function($fileName, $fileInfo) use ($zip)), works as jQuery. // Example: $z->each(function($filename) use ($z){ $z->unzip($filename, "unc/".basename($filename)); }); // 25/07/2012 (v2.664) // - unzip was NOT respecting chmod parameters, and always setting to 0777. (thanks to Stef Dawson, http://stefdawson.com) // 19/08/2011 (v2.663) // - unzipAll was using double slashes (path//filename) to save files. (thanks to Karen Peyton). // 09/08/2010 (v2.662) // - unzipAll parameters fully reviewed and fixed. Thanks Ronny Dreschler and Conor Mac Aoidh. // 12/05/2010 (v2.661) // - Fixed E_STRICT notice: "Only variables should be passed by reference". Thanks Erik W. // 24/03/2010 (v2.66) // - Fixed bug inside unzipAll when dirname is "." (thanks to Thorsten Groth) // - Added character "´" to the string conversion table (ex: caixa d´água) // 27/02/2010 // - Removed PHP4 support (file_put_contents redeclaration). // 04/12/2009 (v2.65) // * Added character translation to decode accents and/or special characters. // 10/11/2009 // * Some security added to avoid malicious ZIP files (relative dirs) // * unzipAll() will output by default to same folder of the caller script // 25/09/2009 // - Code optimization to reduce memory usage (uncompress(&$contents)) // 12/07/2009 (2.62) // - Debug messages are shown only when explicit. // - New method: getLastError() ############################################################## # Class dUnzip2 v2.67 # # Author: Alexandre Tedeschi (d) # E-Mail: alexandrebr at gmail dot com # Londrina - PR / Brazil # # Objective: # This class allows programmer to easily unzip files on the fly. # # Requirements: # This class requires extension ZLib Enabled. It is default # for most site hosts around the world, and for the PHP Win32 dist. # # To do: # * Error handling # * Write a PHP-Side gzinflate, to completely avoid any external extensions # * Write other decompress algorithms # # Methods: # * dUnzip2($filename) - Constructor - Opens $filename # * each($cbEach) - Calls $cbEach($filename, $fileinfo) on each compressed file # * getList([$stopOnFile]) - Retrieve the file list # * getExtraInfo($zipfilename) - Retrieve more information about compressed file # * getZipInfo([$entry]) - Retrieve ZIP file details. # * unzip($zipfilename, [$outfilename, [$applyChmod]]) - Unzip file # * unzipAll([$outDir, [$zipDir, [$maintainStructure, [$applyChmod]]]]) # * close() - Close file handler, but keep the list # * __destroy() - Close file handler and release memory # # If you modify this class, or have any ideas to improve it, please contact me! # You are allowed to redistribute this class, if you keep my name and contact e-mail on it. # # PLEASE! IF YOU USE THIS CLASS IN ANY OF YOUR PROJECTS, PLEASE LET ME KNOW! # If you have problems using it, don't think twice before contacting me! # ############################################################## class dUnzip2 { public function getVersion() { return '2.67'; } // Public public $fileName; public $lastError; public $compressedList = []; // You will problably use only this one! public $centralDirList = []; // Central dir list... It's a kind of 'extra attributes' for a set of files public $endOfCentral = []; // End of central dir, contains ZIP Comments public $debug; // Private private $fh; private $zipSignature = "\\x50\\x4b\\x03\\x04"; // local file header signature private $dirSignature = "\\x50\\x4b\\x01\\x02"; // central dir header signature private $dirSignatureE = "\\x50\\x4b\\x05\\x06"; // end of central dir signature public function __construct($fileName) { $this->fileName = $fileName; } public function getList($stopOnFile = false) { if(count($this->compressedList) !== 0) { $this->debugMsg(1, 'Returning already loaded file list.'); return $this->compressedList; } // Open file, and set file handler $fh = fopen($this->fileName, 'r'); $this->fh = &$fh; if(! $fh) { $this->debugMsg(2, 'Failed to load file.'); return false; } $this->debugMsg(1, "Loading list from 'End of Central Dir' index list..."); if(! $this->_loadFileListByEOF($fh, $stopOnFile)) { $this->debugMsg(1, 'Failed! Trying to load list looking for signatures...'); if(! $this->_loadFileListBySignatures($fh, $stopOnFile)) { $this->debugMsg(1, 'Failed! Could not find any valid header.'); $this->debugMsg(2, 'ZIP File is corrupted or empty'); return false; } } if($this->debug) { #------- Debug compressedList $isHeader = true; echo ""; foreach($this->compressedList as $item) { if($isHeader) { echo ""; foreach($item as $fieldName => $value) { echo sprintf('', $fieldName); } echo ''; $isHeader = false; } echo ""; foreach($item as $fieldName => $value) { if($fieldName == 'lastmod_datetime') { echo sprintf(''; } else { echo sprintf('', $fieldName, $value); } } echo ''; } echo '
%s
', $fieldName).date('d/m/Y H:i:s', $value).'%s
'; #------- Debug centralDirList $isHeader = true; if(count($this->centralDirList) !== 0) { echo ""; foreach($this->centralDirList as $item) { if($isHeader) { echo ""; foreach($item as $fieldName => $value) { echo sprintf('', $fieldName); } echo ''; $isHeader = false; } echo ""; foreach($item as $fieldName => $value) { if($fieldName == 'lastmod_datetime') { echo sprintf(''; } else { echo sprintf('', $fieldName, $value); } } echo ''; } echo '
%s
', $fieldName).date('d/m/Y H:i:s', $value).'%s
'; } #------- Debug endOfCentral if(count($this->endOfCentral) !== 0) { echo ""; echo ""; foreach($this->endOfCentral as $field => $value) { echo ''; echo sprintf('', $field); echo sprintf('', $value); echo ''; } echo '
dUnzip - End of file
%s%s
'; } } return $this->compressedList; } public function getExtraInfo($compressedFileName) { return isset($this->centralDirList[$compressedFileName]) ? $this->centralDirList[$compressedFileName] : false; } public function getZipInfo($detail = false) { return $detail ? $this->endOfCentral[$detail] : $this->endOfCentral; } public function each($cbEachCompreesedFile) { // cbEachCompreesedFile(filename, fileinfo); if(! is_callable($cbEachCompreesedFile)) { die("dUnzip2: You called 'each' method, but failed to provide an Callback as argument. Usage: \\$zip->each(function(\\$filename, \\$fileinfo) use (\\$zip){ ... \\$zip->unzip(\\$filename, 'uncompress/\\$filename'); })."); } $lista = $this->getList(); if(count($lista) !== 0) { foreach($lista as $fileName => $fileInfo) { if(false === call_user_func($cbEachCompreesedFile, $fileName, $fileInfo)) { return false; } } } return true; } public function unzip($compressedFileName, $targetFileName = false, $applyChmod = 0777) { if(count($this->compressedList) === 0) { $this->debugMsg(1, 'Trying to unzip before loading file list... Loading it!'); $this->getList(false); } $fdetails = &$this->compressedList[$compressedFileName]; if(! isset($this->compressedList[$compressedFileName])) { $this->debugMsg(2, sprintf('File \\'%s\\' is not compressed in the zip.', $compressedFileName)); return false; } if(substr($compressedFileName, -1) === '/') { $this->debugMsg(2, sprintf('Trying to unzip a folder name \\'%s\\'.', $compressedFileName)); return false; } if(! $fdetails['uncompressed_size']) { $this->debugMsg(1, sprintf('File \\'%s\\' is empty.', $compressedFileName)); return $targetFileName ? $this->saveFile($targetFileName, '', $applyChmod) : ''; } fseek($this->fh, $fdetails['contents-startOffset']); $toUncompress = fread($this->fh, $fdetails['compressed_size']); $ret = $this->uncompress( $toUncompress, $fdetails['compression_method'], $fdetails['uncompressed_size'], $targetFileName, $applyChmod ); unset($toUncompress); return $ret; } public function unzipAll($targetDir = false, $baseDir = '', $maintainStructure = true, $applyChmod = 0777) { if($targetDir === false) { $targetDir = dirname($_SERVER['SCRIPT_FILENAME']).'/'; } if(substr($targetDir, -1) === '/') { $targetDir = substr($targetDir, 0, -1); } $lista = $this->getList(); if(is_array($lista) && count($lista) !== 0) { foreach($lista as $fileName => $trash) { $dirname = dirname($fileName); $outDN = sprintf('%s/%s', $targetDir, $dirname); if(substr($dirname, 0, strlen($baseDir)) != $baseDir) { continue; } if(! is_dir($outDN) && $maintainStructure) { $str = ''; $folders = explode('/', $dirname); foreach($folders as $folder) { $str = $str !== '' && $str !== '0' ? sprintf('%s/%s', $str, $folder) : $folder; if(! is_dir(sprintf('%s/%s', $targetDir, $str))) { $this->debugMsg(1, sprintf('Creating folder: %s/%s', $targetDir, $str)); mkdir(sprintf('%s/%s', $targetDir, $str), $applyChmod, true); } } } if(substr($fileName, -1, 1) === '/') { continue; } $maintainStructure ? $this->unzip($fileName, sprintf('%s/%s', $targetDir, $fileName), $applyChmod) : $this->unzip($fileName, $targetDir . '/'.basename($fileName), $applyChmod); } } } public function close() { // Free the file resource if($this->fh) { fclose($this->fh); } } public function __destroy() { $this->close(); } private function saveFile($filename, $content, $applyChmod = 0777) { $ok = @touch($filename); if(! $ok) { throw new Exception(sprintf('Failed to create file: %s', $filename)); } $ok = @chmod($filename, $applyChmod); if(! $ok) { throw new Exception(sprintf('Failed to chmod file: %s with permission %s', $filename, $applyChmod)); } $bytesWritten = @file_put_contents($filename, $content); if($bytesWritten === false) { throw new Exception(sprintf('Failed to write file: %s', $filename)); } $this->debugMsg(2, sprintf('File %s saved with %d bytes.', $filename, $bytesWritten)); } private function uncompress(&$content, $mode, $uncompressedSize, $targetFileName = false, $applyChmod = 0777) { switch($mode) { case 0: // Not compressed return $targetFileName ? $this->saveFile($targetFileName, $content, $applyChmod) : $content; case 1: $this->debugMsg(2, 'Shrunk mode is not supported... yet?'); return false; case 2: case 3: case 4: case 5: $this->debugMsg(2, 'Compression factor '.($mode - 1).' is not supported... yet?'); return false; case 6: $this->debugMsg(2, 'Implode is not supported... yet?'); return false; case 7: $this->debugMsg(2, 'Tokenizing compression algorithm is not supported... yet?'); return false; case 8: // Deflate return $targetFileName ? $this->saveFile($targetFileName, gzinflate($content, $uncompressedSize), $applyChmod) : gzinflate($content, $uncompressedSize); case 9: $this->debugMsg(2, 'Enhanced Deflating is not supported... yet?'); return false; case 10: $this->debugMsg(2, 'PKWARE Date Compression Library Impoloding is not supported... yet?'); return false; case 12: // Bzip2 return $targetFileName ? $this->saveFile($targetFileName, bzdecompress($content), $applyChmod) : bzdecompress($content); case 18: $this->debugMsg(2, 'IBM TERSE is not supported... yet?'); return false; default: $this->debugMsg(2, 'Unknown uncompress method: ' . $mode); return false; } } public function debugMsg($level, $string) { if($this->debug) { if($level == 1) { echo sprintf('dUnzip2: %s
', $string); } if($level == 2) { echo sprintf('dUnzip2: %s
', $string); } } $this->lastError = $string; } public function getLastError() { return $this->lastError; } public function _loadFileListByEOF(&$fh, $stopOnFile = false) { // Check if there's a valid Central Dir signature. // Let's consider a file comment smaller than 1024 characters... // Actually, it length can be 65536.. But we're not going to support it. for($x = 0; $x < 1024; $x++) { fseek($fh, -22 - $x, SEEK_END); $signature = fread($fh, 4); if($signature == $this->dirSignatureE) { // If found EOF Central Dir $eodir['disk_number_this'] = unpack('v', fread($fh, 2)); // number of this disk $eodir['disk_number'] = unpack('v', fread($fh, 2)); // number of the disk with the start of the central directory $eodir['total_entries_this'] = unpack('v', fread($fh, 2)); // total number of entries in the central dir on this disk $eodir['total_entries'] = unpack('v', fread($fh, 2)); // total number of entries in $eodir['size_of_cd'] = unpack('V', fread($fh, 4)); // size of the central directory $eodir['offset_start_cd'] = unpack('V', fread($fh, 4)); // offset of start of central directory with respect to the starting disk number $zipFileCommentLenght = unpack('v', fread($fh, 2)); // zipfile comment length $eodir['zipfile_comment'] = $zipFileCommentLenght[1] ? fread($fh, $zipFileCommentLenght[1]) : ''; // zipfile comment $this->endOfCentral = [ 'disk_number_this' => $eodir['disk_number_this'][1], 'disk_number' => $eodir['disk_number'][1], 'total_entries_this' => $eodir['total_entries_this'][1], 'total_entries' => $eodir['total_entries'][1], 'size_of_cd' => $eodir['size_of_cd'][1], 'offset_start_cd' => $eodir['offset_start_cd'][1], 'zipfile_comment' => $eodir['zipfile_comment'], ]; // Then, load file list fseek($fh, $this->endOfCentral['offset_start_cd']); $signature = fread($fh, 4); while($signature == $this->dirSignature) { $dir['version_madeby'] = unpack('v', fread($fh, 2)); // version made by $dir['version_needed'] = unpack('v', fread($fh, 2)); // version needed to extract $dir['general_bit_flag'] = unpack('v', fread($fh, 2)); // general purpose bit flag $dir['compression_method'] = unpack('v', fread($fh, 2)); // compression method $dir['lastmod_time'] = unpack('v', fread($fh, 2)); // last mod file time $dir['lastmod_date'] = unpack('v', fread($fh, 2)); // last mod file date $dir['crc-32'] = fread($fh, 4); // crc-32 $dir['compressed_size'] = unpack('V', fread($fh, 4)); // compressed size $dir['uncompressed_size'] = unpack('V', fread($fh, 4)); // uncompressed size $fileNameLength = unpack('v', fread($fh, 2)); // filename length $extraFieldLength = unpack('v', fread($fh, 2)); // extra field length $fileCommentLength = unpack('v', fread($fh, 2)); // file comment length $dir['disk_number_start'] = unpack('v', fread($fh, 2)); // disk number start $dir['internal_attributes'] = unpack('v', fread($fh, 2)); // internal file attributes-byte1 $dir['external_attributes1'] = unpack('v', fread($fh, 2)); // external file attributes-byte2 $dir['external_attributes2'] = unpack('v', fread($fh, 2)); // external file attributes $dir['relative_offset'] = unpack('V', fread($fh, 4)); // relative offset of local header $dir['file_name'] = fread($fh, $fileNameLength[1]); // filename $dir['extra_field'] = $extraFieldLength[1] ? fread($fh, $extraFieldLength[1]) : ''; // extra field $dir['file_comment'] = $fileCommentLength[1] ? fread($fh, $fileCommentLength[1]) : ''; // file comment // Convert the date and time, from MS-DOS format to UNIX Timestamp $BINlastmod_date = str_pad(decbin($dir['lastmod_date'][1]), 16, '0', STR_PAD_LEFT); $BINlastmod_time = str_pad(decbin($dir['lastmod_time'][1]), 16, '0', STR_PAD_LEFT); $lastmod_dateY = bindec(substr($BINlastmod_date, 0, 7)) + 1980; $lastmod_dateM = bindec(substr($BINlastmod_date, 7, 4)); $lastmod_dateD = bindec(substr($BINlastmod_date, 11, 5)); $lastmod_timeH = bindec(substr($BINlastmod_time, 0, 5)); $lastmod_timeM = bindec(substr($BINlastmod_time, 5, 6)); $lastmod_timeS = bindec(substr($BINlastmod_time, 11, 5)); // Some protection agains attacks... $dir['file_name'] = $this->_decodeFilename($dir['file_name']); if(! $dir['file_name'] = $this->_protect($dir['file_name'])) { continue; } $this->centralDirList[$dir['file_name']] = [ 'version_madeby' => $dir['version_madeby'][1], 'version_needed' => $dir['version_needed'][1], 'general_bit_flag' => str_pad(decbin($dir['general_bit_flag'][1]), 8, '0', STR_PAD_LEFT), 'compression_method' => $dir['compression_method'][1], 'lastmod_datetime' => mktime($lastmod_timeH, $lastmod_timeM, $lastmod_timeS, $lastmod_dateM, $lastmod_dateD, $lastmod_dateY), 'crc-32' => str_pad(dechex(ord($dir['crc-32'][3])), 2, '0', STR_PAD_LEFT). str_pad(dechex(ord($dir['crc-32'][2])), 2, '0', STR_PAD_LEFT). str_pad(dechex(ord($dir['crc-32'][1])), 2, '0', STR_PAD_LEFT). str_pad(dechex(ord($dir['crc-32'][0])), 2, '0', STR_PAD_LEFT), 'compressed_size' => $dir['compressed_size'][1], 'uncompressed_size' => $dir['uncompressed_size'][1], 'disk_number_start' => $dir['disk_number_start'][1], 'internal_attributes' => $dir['internal_attributes'][1], 'external_attributes1' => $dir['external_attributes1'][1], 'external_attributes2' => $dir['external_attributes2'][1], 'relative_offset' => $dir['relative_offset'][1], 'file_name' => $dir['file_name'], 'extra_field' => $dir['extra_field'], 'file_comment' => $dir['file_comment'], ]; $signature = fread($fh, 4); } // If loaded centralDirs, then try to identify the offsetPosition of the compressed data. if($this->centralDirList) { foreach($this->centralDirList as $filename => $details) { $i = $this->_getFileHeaderInformation($fh, $details['relative_offset']); $this->compressedList[$filename]['file_name'] = $filename; $this->compressedList[$filename]['compression_method'] = $details['compression_method']; $this->compressedList[$filename]['version_needed'] = $details['version_needed']; $this->compressedList[$filename]['lastmod_datetime'] = $details['lastmod_datetime']; $this->compressedList[$filename]['crc-32'] = $details['crc-32']; $this->compressedList[$filename]['compressed_size'] = $details['compressed_size']; $this->compressedList[$filename]['uncompressed_size'] = $details['uncompressed_size']; $this->compressedList[$filename]['lastmod_datetime'] = $details['lastmod_datetime']; $this->compressedList[$filename]['extra_field'] = $i['extra_field']; $this->compressedList[$filename]['contents-startOffset'] = $i['contents-startOffset']; if(strtolower($stopOnFile) === strtolower($filename)) { break; } } } return true; } } return false; } public function _loadFileListBySignatures(&$fh, $stopOnFile = false) { fseek($fh, 0); $return = false; for(;;) { $details = $this->_getFileHeaderInformation($fh); if(! $details) { $this->debugMsg(1, 'Invalid signature. Trying to verify if is old style Data Descriptor...'); fseek($fh, 12 - 4, SEEK_CUR); // 12: Data descriptor - 4: Signature (that will be read again) $details = $this->_getFileHeaderInformation($fh); } if(! $details) { $this->debugMsg(1, 'Still invalid signature. Probably reached the end of the file.'); break; } $filename = $details['file_name']; $this->compressedList[$filename] = $details; $return = true; if(strtolower($stopOnFile) === strtolower($filename)) { break; } } return $return; } public function _getFileHeaderInformation(&$fh, $startOffset = false) { if($startOffset !== false) { fseek($fh, $startOffset); } $signature = fread($fh, 4); if($signature == $this->zipSignature) { # $this->debugMsg(1, "Zip Signature!"); // Get information about the zipped file $file['version_needed'] = unpack('v', fread($fh, 2)); // version needed to extract $file['general_bit_flag'] = unpack('v', fread($fh, 2)); // general purpose bit flag $file['compression_method'] = unpack('v', fread($fh, 2)); // compression method $file['lastmod_time'] = unpack('v', fread($fh, 2)); // last mod file time $file['lastmod_date'] = unpack('v', fread($fh, 2)); // last mod file date $file['crc-32'] = fread($fh, 4); // crc-32 $file['compressed_size'] = unpack('V', fread($fh, 4)); // compressed size $file['uncompressed_size'] = unpack('V', fread($fh, 4)); // uncompressed size $fileNameLength = unpack('v', fread($fh, 2)); // filename length $extraFieldLength = unpack('v', fread($fh, 2)); // extra field length $file['file_name'] = fread($fh, $fileNameLength[1]); // filename $file['extra_field'] = $extraFieldLength[1] ? fread($fh, $extraFieldLength[1]) : ''; // extra field $file['contents-startOffset'] = ftell($fh); // Bypass the whole compressed contents, and look for the next file fseek($fh, $file['compressed_size'][1], SEEK_CUR); // Convert the date and time, from MS-DOS format to UNIX Timestamp $BINlastmod_date = str_pad(decbin($file['lastmod_date'][1]), 16, '0', STR_PAD_LEFT); $BINlastmod_time = str_pad(decbin($file['lastmod_time'][1]), 16, '0', STR_PAD_LEFT); $lastmod_dateY = bindec(substr($BINlastmod_date, 0, 7)) + 1980; $lastmod_dateM = bindec(substr($BINlastmod_date, 7, 4)); $lastmod_dateD = bindec(substr($BINlastmod_date, 11, 5)); $lastmod_timeH = bindec(substr($BINlastmod_time, 0, 5)); $lastmod_timeM = bindec(substr($BINlastmod_time, 5, 6)); $lastmod_timeS = bindec(substr($BINlastmod_time, 11, 5)); // Some protection agains attacks... $file['file_name'] = $this->_decodeFilename($file['file_name']); if(! $file['file_name'] = $this->_protect($file['file_name'])) { return false; } // Mount file table $i = [ 'file_name' => $file['file_name'], 'compression_method' => $file['compression_method'][1], 'version_needed' => $file['version_needed'][1], 'lastmod_datetime' => mktime($lastmod_timeH, $lastmod_timeM, $lastmod_timeS, $lastmod_dateM, $lastmod_dateD, $lastmod_dateY), 'crc-32' => str_pad(dechex(ord($file['crc-32'][3])), 2, '0', STR_PAD_LEFT). str_pad(dechex(ord($file['crc-32'][2])), 2, '0', STR_PAD_LEFT). str_pad(dechex(ord($file['crc-32'][1])), 2, '0', STR_PAD_LEFT). str_pad(dechex(ord($file['crc-32'][0])), 2, '0', STR_PAD_LEFT), 'compressed_size' => $file['compressed_size'][1], 'uncompressed_size' => $file['uncompressed_size'][1], 'extra_field' => $file['extra_field'], 'general_bit_flag' => str_pad(decbin($file['general_bit_flag'][1]), 8, '0', STR_PAD_LEFT), 'contents-startOffset' => $file['contents-startOffset'], ]; return $i; } return false; } public function _decodeFilename($filename) { $from = "\\xb7\\xb5\\xb6\\xc7\\x8e\\x8f\\x92\\x80\\xd4\\x90\\xd2\\xd3\\xde\\xd6\\xd7\\xd8\\xd1\\xa5\\xe3\\xe0". "\\xe2\\xe5\\x99\\x9d\\xeb\\xe9\\xea\\x9a\\xed\\xe8\\xe1\\x85\\xa0\\x83\\xc6\\x84\\x86\\x91\\x87\\x8a". "\\x82\\x88\\x89\\x8d\\xa1\\x8c\\x8b\\xd0\\xa4\\x95\\xa2\\x93\\xe4\\x94\\x9b\\x97\\xa3\\x96\\xec\\xe7". "\\x98ï"; $to = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýþÿ´'; return strtr($filename, $from, $to); } public function _protect($fullPath) { // Known hack-attacks (filename like): // /home/usr // ../../home/usr // folder/../../../home/usr // sample/(x0)../home/usr $fullPath = strtr($fullPath, ":*<>|\\"\\x0\\\\", '......./'); while($fullPath[0] === '/') { $fullPath = substr($fullPath, 1); } if(substr($fullPath, -1) === '/') { $base = ''; $fullPath = substr($fullPath, 0, -1); } else { $base = basename($fullPath); $fullPath = dirname($fullPath); } $parts = explode('/', $fullPath); $lastIdx = false; foreach($parts as $idx => $part) { if($part === '.') { unset($parts[$idx]); } elseif($part === '..') { unset($parts[$idx]); if($lastIdx !== false) { unset($parts[$lastIdx]); } } elseif($part === '') { unset($parts[$idx]); } else { $lastIdx = $idx; } } $fullPath = $parts !== [] ? implode('/', $parts).'/' : ''; return $fullPath.$base; } } # init message $msg=""; # quelque chose à installer ? if($curl == true && !empty($_POST) ) { if (!file_exists('tmp')) { mkdir('tmp', 0777, true); } // install latest PluXml if(isset($_POST['pluxml'])) { $zipfile = 'tmp/'.basename($_POST['pluxml']); if(!downloadRemoteFile(trim($_POST['pluxml']), $zipfile)) { $msg .="Erreur Téléchargement". $_POST['pluxml'].'
'; } else { $zip = new dUnzip2($zipfile); $zip->unzipAll('tmp/unZipTmp'); $zip->close(); } $infos = glob('tmp/unZipTmp/*'); if(count($infos)==1) { foreach(glob('tmp/unZipTmp/'.basename($infos[0]).'/*') as $found) { rename($found,substr_replace($found, '', 0, strlen('tmp/unZipTmp/'.basename($infos[0]).'/'))); } deleteTemp('tmp'); $msg .= 'Félicitation!

PluXml est préinstallé,
pour finaliser son installation et commencer à utiliser votre CMS, veuillez cliqué sur ce lien
install.php.
'; } # valeur traitée, on n'en veut plus unset($_POST['pluxml']); } if(!empty($_POST) && !empty(trim($_POST['themeChoice'])) && trim($_POST['themeChoice']) != 0 ) { $themeFile=trim($_POST['themeChoice']); $themeFileName= pathinfo(basename($themeFile), PATHINFO_FILENAME); $zipfile='tmp/'.basename($themeFile); if(!downloadRemoteFile($themeFile, $zipfile)) { $msg .="Erreur Téléchargement du thème.
"; } # fichier téléchargé else { $zip = new dUnzip2($zipfile); # on vide le dossier pour une reinstall propre if(file_exists('themes/'.$themeFileName.'/') && is_dir('themes/'.$themeFileName.'/')) deleteTemp('themes/'.$themeFileName.'/'); # on dezippe l'archive du theme dans le dossier themes $zip->unzipAll('themes/'); $zip->close(); $msg .= 'thème '.$themeFileName.': installé !
'; } } unset($_POST['themeChoice']); # install plugins if(!empty($_POST) && file_exists('plugins') && is_dir('plugins')) { // on verifie l'existence du dossier plugins foreach($_POST as $k => $plugname) { $zipfile='tmp/'.basename($plugAvalaible['plugins'][$plugname]['url']); # on teste si le ficier est téléchargé if(!downloadRemoteFile(trim($plugAvalaible['plugins'][$plugname]['url']), $zipfile)) { $msg .="Erreur Téléchargement ". $plugname.'
'; } # fichier téléchargé else { $zip = new dUnzip2($zipfile); # on vide le dossier pour une reinstall propre if(file_exists('plugins/'.$plugname.'/') && is_dir('plugins/'.$plugname.'/')) deleteTemp('plugins/'.$plugname.'/'); # on dezippe l'archive du plugin dans son dossier $zip->unzipAll('plugins/'.$plugname.'/'); $zip->close(); #on retrouve le dossier $newplugdir = glob('plugins/'.$plugname.'*/*',GLOB_ONLYDIR); $check = substr_replace($newplugdir['0'],'', strlen($plugname),0 ); # on déplace les dossiers extraits au besoin if(strpos(basename($check), $plugname ) === 0 && $check != 'plugins/'.$plugname) { foreach(glob($newplugdir['0'].'/*') as $found) { rename($found,'plugins/'.$plugname.'/'.substr_replace($found, '', 0, strlen($newplugdir['0'].'/'))); } rmdir($newplugdir['0']); } } $msg .= ''.$plugname.': installé !
'; } } # on efface les fichiers temporaires deleteTemp('tmp'); if(strlen($msg)>1) $msg ='

'.$msg.'

'; $_SESSION["msg"] = $msg; header('location:'.$_SERVER['REQUEST_URI']); exit; } ?>

Outil de téléchargements et d'installations

PluXml
et d'une sélection de plugins.

Installation de PluXml

Installer les plugins suivants:

En cas de probléme avec un ou plusieurs plugins,

Signaler sa version et son lien de téléchargement sur le forum:

Pour voir tous les plugins et leurs versions:

Ouvrir le centre de téléchargement.

Il y a actuellement archivées au format .ZIP


Liens officiels du C.M.S. : PluXml - Forum PluXml - télécharger PluXml

Page réservée à l\\'admistrateur

'; }