function create_tables() { if (file_exists($GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_config'] . '/' . 'mysql.php')) { include $GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_config'] . '/' . 'mysql.php'; } $if_not_exists = $GLOBALS['sgdb'] == 'mysql' ? 'IF NOT EXISTS' : ''; // SQLite does'nt know these syntaxes. $auto_increment = $GLOBALS['sgdb'] == 'mysql' ? 'AUTO_INCREMENT' : ''; // SQLite does'nt know these syntaxes, but MySQL needs it. $GLOBALS['dbase_structure']['links'] = "CREATE TABLE " . $if_not_exists . " links\n\t\t(\n\t\t\tID INTEGER PRIMARY KEY {$auto_increment},\n\t\t\tbt_type CHAR(20),\n\t\t\tbt_id BIGINT,\n\t\t\tbt_content TEXT,\n\t\t\tbt_wiki_content TEXT,\n\t\t\tbt_author TEXT,\n\t\t\tbt_title TEXT,\n\t\t\tbt_tags TEXT,\n\t\t\tbt_link TEXT,\n\t\t\tbt_statut TINYINT\n\t\t); CREATE INDEX dateL ON links ( bt_id );"; $GLOBALS['dbase_structure']['commentaires'] = "CREATE TABLE " . $if_not_exists . " commentaires\n\t\t(\n\t\t\tID INTEGER PRIMARY KEY {$auto_increment},\n\t\t\tbt_type CHAR(20),\n\t\t\tbt_id BIGINT,\n\t\t\tbt_article_id BIGINT,\n\t\t\tbt_content TEXT,\n\t\t\tbt_wiki_content TEXT,\n\t\t\tbt_author TEXT,\n\t\t\tbt_link TEXT,\n\t\t\tbt_webpage TEXT,\n\t\t\tbt_email TEXT,\n\t\t\tbt_subscribe TINYINT,\n\t\t\tbt_statut TINYINT\n\t\t); CREATE INDEX dateC ON commentaires ( bt_id );"; $GLOBALS['dbase_structure']['articles'] = "CREATE TABLE " . $if_not_exists . " articles\n\t\t(\n\t\t\tID INTEGER PRIMARY KEY {$auto_increment},\n\t\t\tbt_type CHAR(20),\n\t\t\tbt_id BIGINT,\n\t\t\tbt_date BIGINT,\n\t\t\tbt_title TEXT,\n\t\t\tbt_abstract TEXT,\n\t\t\tbt_notes TEXT,\n\t\t\tbt_link TEXT,\n\t\t\tbt_content TEXT,\n\t\t\tbt_wiki_content TEXT,\n\t\t\tbt_categories TEXT,\n\t\t\tbt_keywords TEXT,\n\t\t\tbt_nb_comments INTEGER,\n\t\t\tbt_allow_comments TINYINT,\n\t\t\tbt_statut TINYINT\n\t\t); CREATE INDEX dateidA ON articles (bt_date, bt_id );"; /* here bt_ID is a GUID, from the feed, not only a 'YmdHis' date string.*/ $GLOBALS['dbase_structure']['rss'] = "CREATE TABLE " . $if_not_exists . " rss\n\t\t(\n\t\t\tID INTEGER PRIMARY KEY {$auto_increment},\n\t\t\tbt_id TEXT,\n\t\t\tbt_date BIGINT,\n\t\t\tbt_title TEXT,\n\t\t\tbt_link TEXT,\n\t\t\tbt_feed TEXT,\n\t\t\tbt_content TEXT,\n\t\t\tbt_statut TINYINT,\n\t\t\tbt_folder TEXT\n\t\t); CREATE INDEX dateidR ON rss (bt_date, bt_id );"; /* * SQLite : opens file, check tables by listing them, create the one that miss. * */ switch ($GLOBALS['sgdb']) { case 'sqlite': if (!creer_dossier($GLOBALS['BT_ROOT_PATH'] . '' . $GLOBALS['dossier_db'])) { die('Impossible de creer le dossier databases (chmod?)'); } $file = $GLOBALS['BT_ROOT_PATH'] . '' . $GLOBALS['dossier_db'] . '/' . $GLOBALS['db_location']; // open tables try { $db_handle = new PDO('sqlite:' . $file); $db_handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db_handle->query("PRAGMA temp_store=MEMORY; PRAGMA synchronous=OFF; PRAGMA journal_mode=WAL;"); // list tables $list_tbl = $db_handle->query("SELECT name FROM sqlite_master WHERE type='table'"); // make an normal array, need for "in_array()" $tables = array(); foreach ($list_tbl as $j) { $tables[] = $j['name']; } // check each wanted table (this is because the "IF NOT EXISTS" condition doesn’t exist in lower versions of SQLite. $wanted_tables = array('commentaires', 'articles', 'links', 'rss'); foreach ($wanted_tables as $i => $name) { if (!in_array($name, $tables)) { $results = $db_handle->query($GLOBALS['dbase_structure'][$name]); } } } catch (Exception $e) { die('Erreur 1: ' . $e->getMessage()); } break; /* * MySQL : create tables with the IF NOT EXISTS condition. Easy. * */ /* * MySQL : create tables with the IF NOT EXISTS condition. Easy. * */ case 'mysql': try { $options_pdo[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $db_handle = new PDO('mysql:host=' . $GLOBALS['mysql_host'] . ';dbname=' . $GLOBALS['mysql_db'] . ";charset=utf8;sql_mode=PIPES_AS_CONCAT;", $GLOBALS['mysql_login'], $GLOBALS['mysql_passwd'], $options_pdo); // check each wanted table $wanted_tables = array('commentaires', 'articles', 'links', 'rss'); foreach ($wanted_tables as $i => $name) { $results = $db_handle->query($GLOBALS['dbase_structure'][$name] . "DEFAULT CHARSET=utf8"); $results->closeCursor(); } } catch (Exception $e) { die('Erreur 2: ' . $e->getMessage()); } break; } return $db_handle; }
redirection('install.php?s=2&l=' . $_POST['langue']); } } else { afficher_form_1(); } } elseif ($GLOBALS['step'] == '2') { // ID + MOT DE PASSE if (isset($_POST['verif_envoi_2'])) { if ($err_2 = valid_install_2()) { afficher_form_2($err_2); } else { $config_dir = '../config'; creer_dossier($config_dir, 1); creer_dossier('../' . $GLOBALS['dossier_images'], 0); creer_dossier('../' . $GLOBALS['dossier_fichiers'], 0); creer_dossier('../' . $GLOBALS['dossier_db'], 1); fichier_adv_conf(); // include it because it contains salt, for passwd $adv_options = parse_ini_file($config_dir . '/config-advanced.ini'); foreach ($adv_options as $option => $value) { $GLOBALS[$option] = $value; } fichier_user(); include_once $config_dir . '/user.php'; traiter_install_2(); redirection('install.php?s=3&l=' . $_POST['langue']); } } else { afficher_form_2(); } } elseif ($GLOBALS['step'] == '3') {
function rafraichir_cache() { creer_dossier($GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_cache'], 1); $arr_a = liste_elements("SELECT * FROM articles WHERE bt_statut = 1 ORDER BY bt_date DESC LIMIT 0, 20", array(), 'articles'); $arr_c = liste_elements("SELECT * FROM commentaires WHERE bt_statut = 1 ORDER BY bt_id DESC LIMIT 0, 20", array(), 'commentaires'); $arr_l = liste_elements("SELECT * FROM links WHERE bt_statut = 1 ORDER BY bt_id DESC LIMIT 0, 20", array(), 'links'); $file = $GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_cache'] . '/' . 'cache_rss_array.dat'; return file_put_contents($file, '<?php /* ' . chunk_split(base64_encode(serialize(array('c' => $arr_c, 'a' => $arr_a, 'l' => $arr_l)))) . ' */'); }
require_once '../inc/inc.php'; error_reporting($GLOBALS['show_errors']); operate_session(); $begin = microtime(TRUE); $GLOBALS['db_handle'] = open_base($GLOBALS['db_location']); $GLOBALS['liste_fichiers'] = open_serialzd_file($GLOBALS['fichier_liste_fichiers']); $GLOBALS['liste_flux'] = open_serialzd_file($GLOBALS['fichier_liste_fluxrss']); afficher_html_head($GLOBALS['lang']['titre_maintenance']); echo '<div id="top">' . "\n"; afficher_msg(); afficher_topnav('preferences.php', $GLOBALS['lang']['titre_maintenance']); echo '</div>' . "\n"; echo '<div id="axe">' . "\n"; echo '<div id="page">' . "\n"; // création du dossier des backups creer_dossier($GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_backup'], 0); /* * reconstruit la BDD des fichiers (qui n’est pas dans SQL, mais un fichier serializé à côte) */ function rebuilt_file_db() { $idir = rm_dots_dir(scandir($GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_images'])); // scans also subdir of img/* (in one single array of paths) foreach ($idir as $i => $e) { $subelem = $GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_images'] . '/' . $e; if (is_dir($subelem)) { unset($idir[$i]); // rm folder entry itself $subidir = rm_dots_dir(scandir($subelem)); foreach ($subidir as $j => $im) { $idir[] = $e . '/' . $im;
function bdd_fichier($fichier, $quoi, $comment, $sup_var) { if ($fichier['bt_type'] == 'image') { $dossier = $GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_images'] . $fichier['bt_path']; } else { $dossier = $GLOBALS['BT_ROOT_PATH'] . $GLOBALS['dossier_fichiers']; $rand_dir = ''; } if (FALSE === creer_dossier($dossier, 0)) { die($GLOBALS['lang']['err_file_write']); } // ajout d’un nouveau fichier if ($quoi == 'ajout-nouveau') { $prefix = ''; foreach ($GLOBALS['liste_fichiers'] as $files) { if ($fichier['bt_checksum'] == $files['bt_checksum']) { $fichier['bt_id'] = $files['bt_id']; return $fichier; } } // éviter d’écraser un fichier existant while (file_exists($dossier . '/' . $prefix . $fichier['bt_filename'])) { $prefix .= rand(0, 9); } $dest = $prefix . $fichier['bt_filename']; $fichier['bt_filename'] = $dest; // redéfinit le nom du fichier. // copie du fichier physique // Fichier uploadé s’il y a (sinon fichier téléchargé depuis l’URL) if ($comment == 'upload') { $new_file = $sup_var['tmp_name']; if (move_uploaded_file($new_file, $dossier . '/' . $dest)) { $fichier['bt_checksum'] = sha1_file($dossier . '/' . $dest); } else { redirection(basename($_SERVER['PHP_SELF']) . '?errmsg=error_fichier_ajout_2'); exit; } } elseif ($comment == 'download' and copy($sup_var, $dossier . '/' . $dest)) { $fichier['bt_filesize'] = filesize($dossier . '/' . $dest); } else { redirection(basename($_SERVER['PHP_SELF']) . '?errmsg=error_fichier_ajout'); exit; } // si fichier par POST ou par URL == OK, on l’ajoute à la base. (si pas OK, on serai déjà sorti par le else { redirection() }. if ($fichier['bt_type'] == 'image') { // miniature si c’est une image create_thumbnail($dossier . '/' . $dest); list($fichier['bt_dim_w'], $fichier['bt_dim_h']) = getimagesize($dossier . '/' . $dest); } else { $fichier['bt_path'] = ''; } // ajout à la base. $GLOBALS['liste_fichiers'][] = $fichier; $GLOBALS['liste_fichiers'] = tri_selon_sous_cle($GLOBALS['liste_fichiers'], 'bt_id'); file_put_contents($GLOBALS['fichier_liste_fichiers'], '<?php /* ' . chunk_split(base64_encode(serialize($GLOBALS['liste_fichiers']))) . ' */'); } elseif ($quoi == 'editer-existant') { $new_filename = $fichier['bt_filename']; $old_filename = $sup_var; if ($new_filename != $old_filename) { // nom du fichier a changé ? on déplace le fichier. $prefix = ''; while (file_exists($dossier . '/' . $prefix . $new_filename)) { // évite d’avoir deux fichiers de même nom $prefix .= rand(0, 9); } $new_filename = $prefix . $fichier['bt_filename']; $fichier['bt_filename'] = $new_filename; // update file name in $fichier array(), with the new prefix. // rename file on disk if (rename($dossier . '/' . $old_filename, $dossier . '/' . $new_filename)) { // si c’est une image : renome la miniature si elle existe, sinon la crée if ($fichier['bt_type'] == 'image') { if (($old_thb = chemin_thb_img_test($dossier . '/' . $old_filename)) != $dossier . '/' . $old_filename) { rename($old_thb, chemin_thb_img($dossier . '/' . $new_filename)); } else { create_thumbnail($dossier . '/' . $new_filename); } } // error rename ficher } else { redirection(basename($_SERVER['PHP_SELF']) . '?file_id=' . $fichier['bt_id'] . '&errmsg=error_fichier_rename'); } } list($fichier['bt_dim_w'], $fichier['bt_dim_h']) = getimagesize($dossier . '/' . $new_filename); // reupdate filesize. // modifie le fichier dans la BDD des fichiers. foreach ($GLOBALS['liste_fichiers'] as $key => $entry) { if ($entry['bt_id'] == $fichier['bt_id']) { $GLOBALS['liste_fichiers'][$key] = $fichier; // trouve la bonne entrée dans la base. } } $GLOBALS['liste_fichiers'] = tri_selon_sous_cle($GLOBALS['liste_fichiers'], 'bt_id'); file_put_contents($GLOBALS['fichier_liste_fichiers'], '<?php /* ' . chunk_split(base64_encode(serialize($GLOBALS['liste_fichiers']))) . ' */'); // écrit dans le fichier, la liste redirection(basename($_SERVER['PHP_SELF']) . '?file_id=' . $fichier['bt_id'] . '&edit&msg=confirm_fichier_edit'); } elseif ($quoi == 'supprimer-existant') { $id = $sup_var; // FIXME ajouter un test de vérification de session (security coin) foreach ($GLOBALS['liste_fichiers'] as $fid => $fich) { if ($id == $fich['bt_id']) { $tbl_id = $fid; break; } } // remove physical file on disk if it exists if (is_file($dossier . '/' . $fichier['bt_filename']) and isset($tbl_id)) { $liste_fichiers = rm_dots_dir(scandir($dossier)); // liste les fichiers réels dans le dossier if (TRUE === unlink($dossier . '/' . $fichier['bt_filename'])) { // fichier physique effacé if ($fichier['bt_type'] == 'image') { // supprimer aussi la miniature si elle existe. @unlink(chemin_thb_img($dossier . '/' . $fichier['bt_filename'])); // supprime la thumbnail si y’a } unset($GLOBALS['liste_fichiers'][$tbl_id]); // efface le fichier dans la liste des fichiers. $GLOBALS['liste_fichiers'] = tri_selon_sous_cle($GLOBALS['liste_fichiers'], 'bt_id'); file_put_contents($GLOBALS['fichier_liste_fichiers'], '<?php /* ' . chunk_split(base64_encode(serialize($GLOBALS['liste_fichiers']))) . ' */'); // enregistre la liste return 'success'; } else { // erreur effacement fichier physique return 'error_suppr_file_suppr_error'; } } // the file in DB does not exists on disk => remove entry from DB if (isset($tbl_id)) { unset($GLOBALS['liste_fichiers'][$tbl_id]); // remove entry from files-list. } $GLOBALS['liste_fichiers'] = tri_selon_sous_cle($GLOBALS['liste_fichiers'], 'bt_id'); file_put_contents($GLOBALS['fichier_liste_fichiers'], '<?php /* ' . chunk_split(base64_encode(serialize($GLOBALS['liste_fichiers']))) . ' */'); // enregistre la liste return 'no_such_file_on_disk'; } }