Textes, variante Julika, version 3.4.5 -- Forum PHP3 gratuit
=================================================================
Ce forum est inspiré de celui écrit par Valentin Lacambre pour Altern.org
License: copyleft (C) 2001-2005 BohwaZ, license Art Libre, www.artlibre.org.
Ecrit par BohwaZ ( Mail: zero@tilt.eu.org | Web: http://kd2.org/ )
Merci à: - Plam ( Mail: 220@chez.com | Web: http://forum-scpo.com/ )
- Grand'Pa ( Web: http://grandpa.lautre.net/ )
Documentation complète sur http://dev.kd2.org/pretextes/
---------------------------------------------------------------
*/
// Les fichiers à utiliser...
$fichier['config'] = "forum_config.inc.php3"; // Config du forum
$fichier['mysql'] = "forum_sql.inc.php3"; // Config de la base de données
$fichier['forum'] = "forum.php3"; // Ce fichier
$fichier['upload'] = "fichiers.php3"; // Fichier du plug-in fichiers attachés
$version = "3.4.5";
// La conf par défaut avant installation
$conf_defaut = array("bgcolor"=>"#ffffff", "text"=>"#000000", "link"=>"#3333FF", "vlink"=>"#009900",
"titre"=>"Mon forum", "intro"=>"Bienvenue dans mon forum. N'hésitez pas à participer.",
"bas"=>"=
Ce forum utilise <PRé>Textes : En savoir plus.",
"motdepasse"=>"abcd", "tables"=>"600", "parpage"=>"20", "couleur1"=>"#ccccff", "couleur2"=>"#eeeeff",
"couleur3"=>"#cc0000", "couleur4"=>"#eeeeee","couleur5"=>"#ffffff","moderation"=>"non","suivi_admin"=>"non",
"autoriser_suivi"=>"non","autoriser_actu"=>"oui","fuseau"=>"serv","alink"=>"#FFCC33","smileys"=>"oui","smileys_path"=>"http://www.tilt.eu.org/smileys/icon_",
"hauteur_form"=>"10","mizenpage"=>"oui");
// Les astuces pour le texte (en HTML)
$astuces = array("Pour mettre un texte en gras, entourez-le de double accolades. Par exemple, en écrivant {{gras}} vous obtiendrez gras.",
"Pour mettre un texte en italique, entourez-le d'accolades. Par exemple, en écrivant {italique} vous obtiendrez italique.",
"Pour créer une liste à puces c'est simple, il suffit de laisser une ligne vide au dessus et en dessous de votre liste et d'utiliser des tirets précédés d'au moins un espace pour les éléments de la liste.",
"Pour créer un lien avec un nom, faites comme ceci : [Salut!->http://tilt.eu.org/] donnera le lien suivant : Salut!.",
"Pour mettre une image dans votre texte, tapez <img|adresse de l'image>. L'image doit être au format GIF, JPEG ou PNG.",
"Pour mettre une image centrée dans votre texte, tapez <img|center|adresse>. En mettant à la place de 'adresse' l'adresse de votre image.",
"Pour mettre une image alignée à gauche dans votre texte, tapez <img|left|adresse>. En mettant à la place de 'adresse' l'adresse de votre image.",
"Pour mettre une image alignée à droite dans votre texte, tapez <img|right|adresse>. En mettant à la place de 'adresse' l'adresse de votre image.");
// Fonction d'entete HTML par défaut
function entete($titre="")
{
global $conf,$HTTP_COOKIE_VARS;
if(empty($titre)) $titre = $conf['titre'];
echo "
".htmlentities(get_titre($titre))."
";
// Si il existe un fichier forum.css on l'utlise, sinon on utlise la feuille de style par défaut.
if(file_exists("forum.css")) echo "";
else echo "";
echo '
";
$texte = str_replace($b,$a,$texte);
}
for($i = 0; $i < count($brute); $i++) {
$a = $brute[$i];
$b = "";
$texte = str_replace($b,$a,$texte);
}
// Traitement des retours à la ligne
$texte = str_replace("\n"," \n",$texte);
$texte = "\n".$texte;
return $texte;
}
function smileys($texte)
{
global $conf;
if(empty($conf[smileys_path])) $path = "http://www.tilt.eu.org/smileys/icon_";
else $path = $conf[smileys_path];
$smileys = array(":D",":)",":(",":oops:",":shock:",":?:","8)",":lol:",":x",":P",":o",":cry:",":evil:",":twisted:",
":roll:",":wink:",":!:",":?",":idea:",":arrow:");
$images = array("biggrin.gif","smile.gif","sad.gif","redface.gif","eek.gif","question.gif","cool.gif","lol.gif","mad.gif","razz.gif",
"surprised.gif","cry.gif","evil.gif","twisted.gif","rolleyes.gif","wink.gif","exclaim.gif","confused.gif","idea.gif","arrow.gif");
if($phpversion > 4) { // PHP3 ne gère pas les paramètres d'entrée en tableaux :(
for($i=0; $i < count($images); $i++) {
$images[$i] = "";
}
$texte = str_replace($smileys,$images,$texte);
}
else {
for($i=0; $i < count($images); $i++) {
$texte = str_replace($smileys[$i],"",$texte);
}
}
return $texte;
}
// Fonction qui vire les codes de mise en page (pour l'affichage des extraits de texte)
function propre($texte)
{
$texte = str_replace("\r","",$texte);
$texte = str_replace("%%"," ",$texte);
$texte = eregi_replace("\[([^\n\[]*)->([^\n]*)\]", "\\1", $texte); // si ya eu un htmlentities avant
$texte = eregi_replace("\[([^\n\[]*)->([^\n]*)\]", "\\1", $texte); // si yen a pas eu
$texte = str_replace("{","",$texte);
$texte = str_replace("}","",$texte);
$texte = eregi_replace("<img\|([^\n]*)>"," ",$texte); // si htmlentities
$texte = eregi_replace(""," ",$texte); // si non
$texte = eregi_replace("<image\|([^\n]*)>"," ",$texte); // si htmlentities
$texte = eregi_replace(""," ",$texte); // si non
return $texte;
}
// Enregistrement de la config
function rec_config($conf)
{
global $fichier;
$conf[titre] = addslashes($conf[titre]);
$conf[intro] = addslashes($conf[intro]);
$conf[bas] = addslashes($conf[bas]);
$conf['version'] = $GLOBALS['version'];
foreach($conf as $key=>$val)
{
if(!isset($conn))
$conn = '"'.$val.'"';
else
$conn.= ', "'.$key.'"=>"'.$val.'"';
}
$conn.= ');?>';
// Si le fichier existe on le vire (évite un bug)
if(file_exists($fichier['config'])) @unlink($fichier['config']);
// On écrit le fichier
$myFile = fopen($fichier['config'], "w");
fputs($myFile, $conn);
fclose($myFile);
}
// Enregistrement de l'installation
function rec_install()
{
global $fichier,$conf_defaut,$HTTP_POST_VARS;
// on récupère les variables grâce aux variables HTTP_POST (plus sécure)
$host = $HTTP_POST_VARS['host']; $bdd = $HTTP_POST_VARS['bdd'];
$user = $HTTP_POST_VARS['user']; $table = $HTTP_POST_VARS['table'];
$pass = $HTTP_POST_VARS['pass'];
// On vérifie que les trucs sont bien là
if(empty($host)) install("L'adresse du serveur SQL n'a pas été spécifiée.");
elseif(empty($user)) install("Le login d'accès du serveur SQL n'a pas été spécifié.");
elseif(empty($pass)) install("Le mot de passe d'accès du serveur SQL n'a pas été spécifié.");
elseif(empty($bdd)) install("La base de données à utiliser du serveur SQL n'a pas été spécifiée.");
elseif(empty($table)) install("La table à utiliser n'a pas été spécifiée.");
// On vérifie que la connexion à la base se fait bien.
if(mysql_connect($host, $user, $pass) == FALSE)
install("La connexion à la base de données a échouée. Vérifiez votre configuration.");
$lien = mysql_connect($host, $user, $pass);
if(mysql_select_db($bdd,$lien) == FALSE)
install("La sélection de la base de données à échouée. Vérifiez vos paramètres.");
// On vérifie si la table existe
$requete = "SELECT id FROM ".$table;
$resultat = mysql_query($requete);
if($resultat < 1) {
$requete = "CREATE TABLE ".$table." (
id INT AUTO_INCREMENT PRIMARY KEY,
nom varchar(80) NOT NULL DEFAULT 'Anonyme',
email varchar(100) NULL,
sujet varchar(100) NOT NULL,
texte TEXT NOT NULL,
date INT(20) NOT NULL,
parent INT NOT NULL DEFAULT '0',
date_fiston INT(20) NULL,
ip VARCHAR(40) NOT NULL DEFAULT 'Inconnue',
statut ENUM('suivi','admin','actu','rien') NOT NULL DEFAULT 'rien',
validation ENUM('oui','non') NOT NULL DEFAULT 'oui');";
$resultat = mysql_query($requete);
if($resultat < 1) install("Erreur dans la création de la table: ".mysql_error().".");
}
// On écrit le fichier de conf SQL
$conn = "
Problème technique
\".mysql_error().\"\");\n";
$conn.= "@mysql_select_db(\$bdd,\$lien) or die(\"
Problème technique
\".mysql_error().\"
\");\n\n";
$conn.= "\$host = \"\";\n\$user = \"\";\n\$pass = \"\";\n\$bdd = \"\";\n";
$conn.= "?>";
$myFile = fopen($fichier['mysql'], "w");
fputs($myFile, $conn);
fclose($myFile);
// On enregistre la conf par défaut
rec_config($conf_defaut);
// All right babe! On peux utiliser le forum
entete("Textes");
echo "
Configuration MySQL réussie
Votre forum est désormais fonctionnel.
Cliquez ici pour commencer à utiliser votre forum.
Nota:
le mot de passe d'administration est « abcd » (sans les guillemets).
");
}
// Installation du forum
function install($msg="")
{
global $conf_defaut,$fichier;
$conf = $conf_defaut;
global $host,$user,$pass,$bdd,$table;
if(empty($host)) $host = "localhost";
entete("Textes");
echo "
";
bas("=
");
exit;
}
// Liste des messages sur la page d'accueil
function liste_msg($debut="",$msg="")
{
global $conf,$table,$fichier,$astuces,$HTTP_COOKIE_VARS,$HTTP_POST_VARS;
// Si le forum est fermé on peux pas poster de message = le formulaire est désactivé
if(($conf['moderation'] == "aucune") && ($HTTP_COOKIE_VARS['forum_passe'] <> md5($conf['motdepasse']))) $disabled = " disabled";
if(empty($debut)) $debut = 0;
$parpage = $conf['parpage'];
entete();
echo "
";
// Si dans la conf ya les actus alors on affiche le petit bloc actus
if($conf['autoriser_actu'] == "oui")
{
$tactu = "statut <> 'actu' AND ";
$requete = "SELECT sujet,id,texte,date FROM ".$table." WHERE statut='actu' ORDER BY date DESC LIMIT 0,1";
$resultat = mysql_query($requete);
echo "
";
// On affiche un message d'erreur le cas échéant
if(!empty($msg)) echo "
".htmlentities(stripslashes($msg))."
";
// Si c'est l'admin qu'est là (il a le cookie qui correspond au passe)
if($HTTP_COOKIE_VARS['forum_passe'] == md5($conf['motdepasse'])) {
if($conf['moderation'] == "oui") { // Si le forum est modéré à priori, lien vers les messages à valider
$requete = "SELECT COUNT(*) FROM ".$table." WHERE validation='non'";
$res = mysql_fetch_row(mysql_query($requete));
$nb = $res[0];
echo "
Petite astuce... ";
// On afiche une astuce au hasard
mt_srand((float) microtime()*1000000);
$i = mt_rand(0,count($astuces)-1);
echo stripslashes($astuces[$i])."
";
// Si admin, liens Config/Déco
if(md5($conf['motdepasse']) == $HTTP_COOKIE_VARS['forum_passe']) echo "ConfigurationDéconnexion";
else echo "";
echo "
";
bas();
exit;
}
// Ajouter un message au forum
function ajouter($parent)
{
global $HTTP_POST_VARS,$conf,$fichier,$table,$HTTP_COOKIE_VARS;
if($GLOBALS[fichiers] == "oui" && ($GLOBALS[fichiers_users] == "oui" || ($HTTP_COOKIE_VARS['forum_passe'] == md5($conf['motdepasse'])))) {
global $file,$file_size,$file_name;
if($file_size > 0) {
if(($file_size > ($GLOBALS[fichiers_max] * 1000)) || eregi("\.(php|cgi|ssi|php3|php4|phtml|pl)$",$file_name)) {
if($parent == 0) liste_msg("","Erreur ! Votre fichier fait plus de ".$GLOBALS[fichiers_max]."Ko ou est un script serveur.");
else lecture($parent,"Erreur ! Votre fichier fait plus de ".$GLOBALS[fichiers_max]."Ko ou est un script serveur.");
}
$f = "oui";
}
}
$REMOTE_ADDR = getenv("REMOTE_ADDR");
// Si le forum est fermé, faut pas chercher, on peut pas poster, même en trichant
if($conf['moderation'] == "aucune") header("location: ".$fichier['forum']);
// On récupère les variables
$sujet = $HTTP_POST_VARS['sujet'];
$nom = $HTTP_POST_VARS['nom'];
$email = $HTTP_POST_VARS['email'];
$texte = $HTTP_POST_VARS['texte'];
// Si sujet/message vide, alors forum pas content
if($parent == 0) {
if(empty($sujet)) liste_msg("","Erreur ! Veuillez entrer un sujet.");
elseif(empty($texte)) liste_msg("","Erreur ! Veuillez entrer un message.");
}
else {
if(empty($sujet)) lecture($parent,"Erreur ! Veuillez entrer un sujet.");
elseif(empty($texte)) lecture($parent,"Erreur ! Veuillez entrer un message.");
}
// On fait du préparage de variables
$nom = trim(addslashes($nom));
$email = trim(addslashes($email));
$sujet = trim(addslashes($sujet));
$texte = trim(addslashes($texte));
$date = time();
$requete = "INSERT INTO ".$table." SET sujet=\"$sujet\", texte=\"$texte\", email=\"$email\", \n";
$requete.= "nom=\"$nom\", date=\"$date\", parent=\"$parent\", date_fiston=\"$date\", ip=\"".$REMOTE_ADDR."\"";
// Si Suivi des mails alors on récupère les mails
if($conf['autoriser_suivi'] == "oui") {
if($HTTP_POST_VARS['suivimail'] == "oui") {
if(!eregi("^([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+)$",$email)) {
if($parent == 0) liste_msg("","Erreur ! Veuillez entrer une adresse eMail valide.");
else lecture($parent,"Erreur ! Veuillez entrer une adresse eMail valide.");
}
$requete.= ", statut='suivi'";
}
if($parent > 0) {
$requete2 = "SELECT email FROM ".$table." WHERE (parent=\"$parent\" OR id=\"$parent\") AND statut='suivi' AND validation='oui'";
$resultat = mysql_query($requete2);
if(mysql_num_rows($resultat) > 0) {
while($rec = mysql_fetch_array($resultat)) {
if(empty($dests)) $dests = stripslashes(trim($rec['email']));
else $dests.= ", ".stripslashes(trim($rec['email']));
}
$headers = "Bcc: ".$dests."\nFrom: ".$conf['email']."\nReply-To: ".$conf['email']."\nReturn-Path: ".$conf['email'];
$titre = get_titre();
$body = "CECI EST UN MESSAGE AUTOMATIQUE, MERCI DE NE PAS Y REPONDRE\n";
$body.= "-----------------------------------------------------------\n\n";
$body.= "Il y a un nouveau message sur le forum ".$titre.".\n\nVous pouvez y répondre ici:\n";
$body.= "http://".getenv("HTTP_HOST").getenv("REQUEST_URI")."?lecture=".$parent."#repondre\n".
"Dans le sujet: ".stripslashes(stripslashes($sujet))."\nAuteur: ".$nom.
"\nDate: ".date("d/m/Y H\hi")."\n\n".propre(stripslashes(stripslashes($texte)));
$body.= "\n\n-----------------------------------------------------------\n";
$body.= "Pour ne plus reçevoir les réponses à ce message, rendez-vous ici:\nhttp://".getenv("HTTP_HOST").getenv("REQUEST_URI")."?unwatch=".$parent;
@mail($conf['email'],"[Forum] $titre",$body,$headers);
$no_admin = "oui";
}
}
}
if(($conf['suivi_admin'] == "oui") && ($no_admin <> "oui")) {
$headers = "From: ".$conf['email']."\nReply-To: ".$conf['email']."\nReturn-Path: ".$conf['email'];
$titre = get_titre();
$body = "CECI EST UN MESSAGE AUTOMATIQUE, MERCI DE NE PAS Y REPONDRE\n";
$body.= "-----------------------------------------------------------\n\n";
$body.= "Il y a un nouveau message sur le forum ".$titre.".\n\nDans le sujet: ".$sujet."\nAuteur: ".$nom."\nDate: ".date("d/m/Y H\hi")."\n\n".propre(stripslashes(stripslashes($texte)));
@mail($conf['email'],"[Forum] $titre",$body,$headers);
}
// Si admin, alors on prend en compte les options
if($HTTP_COOKIE_VARS['forum_passe'] == md5($conf['motdepasse'])) {
$option = $HTTP_POST_VARS['option'];
if($option == "actu") $requete.= ", statut='actu', validation='oui'";
elseif($option == "admin") $requete.= ", statut='admin', validation='oui'";
else {
if($conf['moderation'] == "oui") {
if($HTTP_POST_VARS['validation'] == "oui") $requete.= ", validation='oui'";
else $requete.= ", validation='non'";
}
}
}
else {
if($conf['moderation'] == "oui") $requete.= ", validation='non'";
elseif($conf['moderation'] == "aucune") liste_msg("","Vous ne pouvez pas ajouter de messages.");
else $requete.= ", validation='oui'";
}
$resultat = mysql_query($requete) or die("Problème technique.");
if($f == "oui") {
$id = mysql_insert_id();
$ext = substr($file_name,strrpos($file_name,".")+1);
copy($file,"fichiers/".$id.".".$ext);
}
// Si le message est dans un fil, alors on met à jour la date du papa
if($parent > 0) {
$requete = "UPDATE ".$table." SET date_fiston=\"$date\",nb_reponses=nb_reponses+1 WHERE id=\"$parent\"";
$resultat = mysql_query($requete);
}
if($parent < 1) header("location: ".$fichier['forum']);
else header("location: ".$fichier['forum']."?lecture=".$parent);
}
// Lire un fil
function lecture($id,$msg="")
{
global $conf,$fichier,$table,$astuces,$HTTP_COOKIE_VARS,$HTTP_POST_VARS,$debut;
$GLOBALS[id2] = $id;
$requete = "SELECT COUNT(*) FROM ".$table." WHERE id=\"$id\"";
$res = mysql_fetch_row(mysql_query($requete));
if($res[0] <> 1) header("location: ".$fichier['forum']);
$parpage = $conf['parpage'];
if(empty($debut)) $debut = 0;
// Si forum fermé, pas de post possible
if(($conf['moderation'] == "aucune") && ($HTTP_COOKIE_VARS['forum_passe'] <> md5($conf['motdepasse']))) $disabled = " disabled";
entete();
if(!empty($msg)) echo "
";
}
// On compte le nombre de réponses
if($total >= 1)
{
// On affiche les messages fiston s'il y en a
$requete = "SELECT id,sujet,texte,nom,date,email,statut,ip FROM ".$table." WHERE parent=\"$id\" ORDER BY date ASC LIMIT ".$debut.",".$parpage;
$resultat = mysql_query($requete);
$nb = mysql_num_rows($resultat);
echo "
";
if($debut == 0) echo "Réponses à ce message :";
else {
$requete = "SELECT sujet FROM ".$table." WHERE id=\"$id\"";
$res = mysql_fetch_row(mysql_query($requete));
$titre = htmlentities(stripslashes($res[0]));
$sujet1 = $titre;
echo "Réponses au message « ".$titre." ».
";
$requete = "SELECT id,sujet,date FROM ".$table." WHERE id <> \"$id\" AND statut = 'actu' ORDER BY date DESC LIMIT 0,6";
$resultat = mysql_query($requete);
if(mysql_num_rows($resultat) > 0)
{
echo "