Ce fichier est une faille potentielle de sécurité, ne l\'utilisez qu\'en local, ou si vous êtes certain de ce que vous faites');
/*
** Ce fichier permet de créer un fichier MOD à partir d'un diff
*/
// Han han ça va mettre trois plombes c'est normal ;)
set_time_limit(0);
error_reporting(E_ALL);
define('FILE_ADDED', 1);
define('FILE_DELETED', 2);
define('FILE_UPDATED', 3);
define('ROOT', '../');
define('PHPEXT', 'php');
// Activer ou non le debugage, utile pour le developpement
define('DEBUG', TRUE);
// Protection de la page
if (strpos($_SERVER['PHP_SELF'], 'start.') !== FALSE)
{
exit;
}
/*
** Méthode magique permettant le chargement dynamique de classes
*/
function __autoload($classname)
{
$classname = strtolower($classname);
fsb_import($classname);
}
/*
** Permet d'accéder partout aux variables globales necessaires au fonctionement du forum
*/
class Fsb extends Fsb_model
{
public static $cfg;
public static $db;
public static $debug;
public static $frame;
public static $mods;
public static $session;
public static $tpl;
}
/*
** Inclus un fichier dans le dossier main/ de façon intéligente
** -----
** $file :: Nom du fichier
*/
function fsb_import($filename)
{
static $store;
if (!isset($store[$filename]))
{
$split = explode('_', $filename);
if (file_exists(ROOT . 'main/class/class_' . $filename . '.' . PHPEXT))
{
include_once(ROOT . 'main/class/class_' . $filename . '.' . PHPEXT);
}
else if (file_exists(ROOT . 'main/class/' . $split[0] . '/' . $filename . '.' . PHPEXT))
{
include_once(ROOT . 'main/class/' . $split[0] . '/' . $filename . '.' . PHPEXT);
}
else if (file_exists(ROOT . 'main/' . $split[0] . '/' . $filename . '.' . PHPEXT))
{
include_once(ROOT . 'main/' . $split[0] . '/' . $filename . '.' . PHPEXT);
}
else if (file_exists(ROOT . 'main/' . $filename . '.' . PHPEXT))
{
include_once(ROOT . 'main/' . $filename . '.' . PHPEXT);
}
$store[$filename] = TRUE;
}
}
// Instance de la classe Debug
Fsb::$debug = new Debug();
// Inclusion des fonctions / classes communes à toutes les pages
include_once(ROOT . 'config/config.' . PHPEXT);
fsb_import('csts');
fsb_import('globals');
fsb_import('fcts_common');
// Ajoute le tableau $add à la suite du tableau $base
function _array_add($base, $add)
{
foreach ($add AS $item)
{
$base[] = $item;
}
return ($base);
}
// Récupère une liste des fichiers ajoutés / supprimés / modifiés
function analyse_directories($from, $to, $del)
{
$list = array();
$forbidden = array('cache/sql/', 'cache/xml/', 'cache/sql_backup/', 'cache/diff/', 'tpl/WhiteSummer/cache/', 'admin/adm_tpl/cache/', 'upload/', 'main/lib/highlight/', 'programms/', 'doc/', 'config/', 'install/', 'main/Artichow/', 'tpl/WhiteSummer/img/', 'admin/adm_tpl/img/', 'img/');
foreach ($forbidden AS $f)
{
if (preg_match('#' . $f . '$#', $from) || preg_match('#' . $f . '$#', $to))
{
return ($list);
}
}
if (is_dir($from))
{
$fd = opendir($from);
while ($file = readdir($fd))
{
if ($file == '.' || $file == '..' || $file == 'Thumbs.db')
{
continue;
}
if (is_dir($from . $file))
{
$list = _array_add($list, analyse_directories($from . $file . '/', $to . $file . '/', $del));
}
else if (file_exists($to . $file))
{
$list[] = array(
'filename' => substr($to, strlen($del)) . $file,
'status' => FILE_UPDATED,
);
}
else
{
$list[] = array(
'filename' => substr($to, strlen($del)) . $file,
'status' => FILE_DELETED,
);
}
}
closedir($fd);
}
if (is_dir($to))
{
$fd = opendir($to);
while ($file = readdir($fd))
{
if ($file == '.' || $file == '..' || $file == 'Thumbs.db')
{
continue;
}
if (!file_exists($from . $file) && !is_dir($to . $file))
{
$list[] = array(
'filename' => substr($to, strlen($del)) . $file,
'status' => FILE_ADDED,
);
}
else if (!file_exists($from . $file))
{
$list = _array_add($list, analyse_directories($from . $file . '/', $to . $file . '/', $del));
}
}
closedir($fd);
}
return ($list);
}
// Trie les ajouts / suppressions et mises à jours de fichiers dans un tableau
function sort_directories($analyse)
{
$return = array('add' => array(), 'delete' => array(), 'update' => array());
$dynamic = array(FILE_ADDED => 'add', FILE_DELETED => 'delete', FILE_UPDATED => 'update');
foreach ($analyse AS $item)
{
$varname = $dynamic[$item['status']];
$return[$varname][] = $item['filename'];
}
return ($return);
}
// Vérification des fichiers mis à jour
function check_updated_files($update, $from, $to)
{
fsb_import('class_diff');
//$update = array('main/class/class_sql_interval.php');
$code = '';
foreach ($update AS $k => $file)
{
$diff = new Diff;
$diff->load_file($from . $file, $to . $file, TRUE);
$exists = false;
foreach ($diff->entries AS $data)
{
if ($data['state'] != Diff::EQUAL)
{
$exists = true;
break;
}
}
unset($update[$k]);
if ($exists)
{
$code .= create_code($file, $diff, $from);
}
unset($diff);
}
return ($code);
}
// Création du code XML
function create_code($file, &$diff, $from)
{
$content = str_replace(array("\r\n", "\r"), array("\n", "\n"), file_get_contents($from . $file));
$code = "\t\t\n\t\t\t$file\n";
$s = explode('/', $file);
if ($s[0] == 'lang' || $s[0] == 'tpl')
{
$code .= "\t\t\t" . $s[0] . "\n";
}
$code .= "\t\t\n";
foreach ($diff->entries AS $i => $item)
{
if ($item['state'] == Diff::EQUAL)
{
continue;
}
if ($item['state'] == Diff::CHANGE && preg_match('#\*\* \| Last :#si', $item['file1']))
{
continue;
}
switch ($item['state'])
{
case Diff::ADD :
$code .= "\t\t\n\t\t\t 0) ? true : false;
$modif = 1;
$type = 'file1';
while (1)
{
//echo '' . $diff->entries[($i > 0) ? $i - $modif : $i + $modif][$type] . '
';
if ($before)
{
preg_match_all('#' . preg_quote($change_find . $item['file1'], '#') . '#si', $content_cut, $m);
}
else
{
preg_match_all('#' . preg_quote($item['file1'] . $change_find, '#') . '#si', $content_cut, $m);
}
if (count($m[0]) < 2)
{
break;
}
$split = explode("\n", str_replace("\r", "", $diff->entries[($i > 0) ? $i - $modif : $i + $modif][$type]));
$c = count($split);
$nb = $c;
if ($l >= $nb)
{
$modif++;
$type = ($diff->entries[($i > 0) ? $i - $modif : $i + $modif]['state'] == Diff::ADD || $diff->entries[($i > 0) ? $i - $modif : $i + $modif]['state'] == Diff::CHANGE) ? 'file2' : 'file1';
$l = 0;
continue;
}
$change_find = ($i > 0) ? $split[$c - ++$l] . "\n" . $change_find : $change_find . "\n" . $split[$l++];
}
if ($before)
{
$f1 = $change_find;
$f2 = $item['file2'];
$text = 'apres ajouter';
}
else
{
$f1 = $change_find;
$f2 = $item['file2'];
$text = 'avant ajouter';
}
$code .= "$f1]]>\n\t\t\n\t\t\n\t\t\t\n";
break;
case Diff::DROP :
$content_cut = $content;
$change_find = '';
$before = false;
$l = 0;
$before = ($i > 0) ? true : false;
$modif = 1;
$type = 'file1';
while (1)
{
//echo '' . $diff->entries[($i > 0) ? $i - $modif : $i + $modif][$type] . '
';
if ($before)
{
preg_match_all('#' . preg_quote($change_find . $item['file1'], '#') . '#si', $content_cut, $m);
}
else
{
preg_match_all('#' . preg_quote($item['file1'] . $change_find, '#') . '#si', $content_cut, $m);
}
if (count($m[0]) < 2)
{
break;
}
$split = explode("\n", str_replace("\r", "", $diff->entries[($i > 0) ? $i - $modif : $i + $modif][$type]));
$c = count($split);
$nb = $c;
if ($l >= $nb)
{
$modif++;
$type = ($diff->entries[($i > 0) ? $i - $modif : $i + $modif]['state'] == Diff::ADD || $diff->entries[($i > 0) ? $i - $modif : $i + $modif]['state'] == Diff::CHANGE) ? 'file2' : 'file1';
$l = 0;
continue;
}
$change_find = ($i > 0) ? $split[$c - ++$l] . "\n" . $change_find : $change_find . "\n" . $split[$l++];
}
if ($before)
{
$f1 = $change_find . $item['file1'];
$f2 = $change_find;
}
else
{
$f1 = $item['file1'] . $change_find;
$f2 = $change_find;
}
$code .= "\t\t\t\n\t\t\t\n\t\t\n";
$code .= "\t\t\n\t\t\t\n";
break;
case Diff::CHANGE :
$content_cut = $content;
$change_find = '';
$before = false;
$l = 0;
$before = ($i > 0) ? true : false;
$modif = 1;
$type = 'file1';
while (1)
{
//echo '' . $diff->entries[($i > 0) ? $i - $modif : $i + $modif][$type] . '
';
if ($before)
{
preg_match_all('#' . preg_quote($change_find . $item['file1'], '#') . '#si', $content_cut, $m);
}
else
{
preg_match_all('#' . preg_quote($item['file1'] . $change_find, '#') . '#si', $content_cut, $m);
}
if (count($m[0]) < 2)
{
break;
}
$split = explode("\n", str_replace("\r", "", $diff->entries[($i > 0) ? $i - $modif : $i + $modif][$type]));
$c = count($split);
$nb = $c;
if ($l >= $nb)
{
$modif++;
$type = ($diff->entries[($i > 0) ? $i - $modif : $i + $modif]['state'] == Diff::ADD || $diff->entries[($i > 0) ? $i - $modif : $i + $modif]['state'] == Diff::CHANGE) ? 'file2' : 'file1';
$l = 0;
continue;
}
$change_find = ($i > 0) ? $split[$c - ++$l] . "\n" . $change_find : $change_find . "\n" . $split[$l++];
}
if ($before)
{
$f1 = $change_find . $item['file1'];
$f2 = $change_find . $item['file2'];
}
else
{
$f1 = $item['file1'] . $change_find;
$f2 = $item['file2'] . $change_find;
}
//echo "
$f1";
//exit;
$code .= "\t\t\t\n\t\t\t\n\t\t\n";
$code .= "\t\t\n\t\t\t\n";
break;
}
$code .= "\t\t\n";
}
return ($code);
}
// Liste des fichiers à copier
function check_added_files($add)
{
$code = "\t\t\n";
foreach ($add AS $file)
{
$code .= "\t\t\t\n\t\t\t\t$file\n";
$split = explode('/', $file);
if ($split[0] == 'lang' || $split[0] == 'tpl')
{
$code .= "\t\t\t\t" . $split[0] . "/\n";
}
$code .= "\t\t\t\n";
}
$code .= "\t\t\n";
return ($code);
}
// Header XML
function add_header()
{
$from = $_POST['version_from'];
$to = $_POST['version_to'];
$code = '' . "\n";
$code .= '' . "\n";
$code .= "\n";
$code .= "\t\n";
$code .= "\t\tMise à jour $from - $to\n";
$code .= "\t\t1.0.0\n";
$code .= "\t\t\n";
$code .= "\t\t\tGenova\n";
$code .= "\t\t\thttp://www.fire-soft-board.com\n";
$code .= "\t\t\tgenovakiller@yahoo.fr\n";
$code .= "\t\t\n";
$code .= "\t\t\n";
$code .= "\t\n";
$code .= "\t\n";
return ($code);
}
// Footer XML
function add_footer()
{
$code = "\t\t\n";
$code = "\t\t\n";
$code = "\t\n";
$code .= "";
return ($code);
}
// Créé le dossier de maj
function create_dir($code, $add, $from)
{
if (!is_dir('maj'))
{
mkdir('maj');
}
if (!is_dir('maj/root'))
{
mkdir('maj/root');
}
foreach ($add AS $file)
{
$split = explode('/', $file);
$c = count($split);
$p = 'maj/root/';
for ($i = 0; $i < $c - 1; $i++)
{
$p .= $split[$i] . '/';
if (!is_dir($p))
{
mkdir($p);
}
}
copy($from . $file, 'maj/root/' . $file);
}
$fd = fopen('maj/install.xml', 'w');
fwrite($fd, $code);
fclose($fd);
}
// Création du fichier de mise à jour
function create_update($from, $to)
{
$analyse = analyse_directories($from, $to, $to);
$analyse = sort_directories($analyse);
$code = add_header();
$code .= check_added_files($analyse['add']);
$code .= check_updated_files($analyse['update'], $from, $to);
$code .= add_footer();
create_dir($code, $analyse['add'], $to);
return ($code);
}
// Main
if (isset($_POST['submit']))
{
$from = $_POST['from'];
if ($from[strlen($from) - 1] != '/') $from .= '/';
$to = $_POST['to'];
if ($to[strlen($to) - 1] != '/') $to .= '/';
$code = create_update($from, $to);
}
?>
' . htmlspecialchars($code) . ''; ?>