/* * * * * * * * * * * * * * * * * * * * * * *
a Blork engine v0.3
Script du moteur
Des commentaires sont placés tout au long du script pour que vous puissiez
mieux comprendre son fonctionnement, et éventuellement le personnaliser.
Attention cependant, ce script est distribué sous licence GNU GPL, vous devez
accepter les conditions posées par cette licence et les respecter, ou des actions
pourraient être engagées contre vous.
Une copie (en anglais) de la license GNU GPL est disponible dans l'archive qui
contient le script.
Soyez prudents si vous comptez modifier le script, ne faites pas n'importe quoi
et renseignez vous si vous n'êtes pas sûr de vos actions ou de votre code. Ce
script permet notamment à un utilisateur de rentrer lui-même des données par le
biais du formulaire prévu à cet effet, ou par l'url directement.
Pour cette raison vous devez être encore plus vigilant que d'ordinaire, assurez
vous que votre code est sûr et ne permettra pas à une personne mal intentionnée
de vous causer des problèmes.
* * * * * * * * * * * * * * * * * * * * * * *
a Blork engine
Copyright (C) 2003-2008 zulios@blork.net
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * *
ETAPE 0 - DECLARATIONS
- Définition de la version du moteur
- Fonctions de base
- NB: Cette étape n'est pas chronométrée, car il s'agit de déclarer des variables
de base et des fonctions indispensables. Il n'y a rien à optimiser ici hormis
les fonctions elles-même; on verra leur rapidité quand elles seront utilisées
pour le script dans les étapes suivantes.
* * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * *
DEFINITION DE LA VERSION DU SCRIPT
On définit la version du moteur
Les fichiers de config et de listing des erreurs y correspondant seront recherchés
*/
$engine_version="03";
// On en profite pour définir des variables de base
$mot_supprime="";
/* * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * *
FONCTIONS DE BASE
Il s'agit de fonctions génériques qui parent à la plupart des situations courantes.
Vous ne devriez pas avoir à y toucher; cette partie est donc réservée de préférence
aux utilisateurs avertis, y compris la fonction qui affiche le formulaire.
Faites bien attention si vous tentez de les bidouiller! Vous ne pourrez vous en
prendre qu'à vous-même en cas de problème.
*/
/*
Fonction envoie_headers() (fonction de base)
Cette fonction permet d'envoyer des entêtes HTTP
dans le cas où le script serait amené à être arrêté lors de la période
des vérification préliminaires à la recherche.
*/
function envoie_headers()
{
if(!headers_sent())
{
echo("
a Blork engine
");
}
}
/*
Fonction erreur_creve() (fonction de base)
Cette fonction est complémentaire à envoie_headers()
Elle permet d'afficher un message d'erreur détaillé pour les erreurs courantes
connues, et empêche le script de fonctionner pour éviter bugs et/ou problèmes
de sécurité.
*/
function erreur_creve($erreur_id,$raison,$engine_version)
{
envoie_headers();
require("blork_engine_errors_".$engine_version.".php");
echo("");
echo("
* a Blork engine - arrêt maladie *");
echo(nl2br($erreurs[$erreur_id]));
echo("
".$raison."");
echo("
Pendant que vous corrigez votre erreur,
ce script et son auteur partiront boire des cocktails sous les cocotiers.
Elle est pas belle la vie?
");
exit();
}
/*
Fonctions demarre_chrono_you() et demarre_chrono_sys() (fonctions de base)
Ces fonctions sont utilisées pour le debug mode; elles démarrent un chronomètre
qui permettra de mesurer le temps utilisé par le script à différents intervalles.
*/
function demarre_chrono_you()
{
if(function_exists("getrusage"))
{
$dat=getrusage();
$utime_before=$dat["ru_utime.tv_sec"]*1e6+$dat["ru_utime.tv_usec"];
return($utime_before);
}
else
{
return("0");
}
}
function demarre_chrono_sys()
{
if(function_exists("getrusage"))
{
$dat=getrusage();
$stime_before=$dat["ru_stime.tv_sec"]*1e6+$dat["ru_stime.tv_usec"];
return($stime_before);
}
else
{
return("0");
}
}
/*
Fonctions affiche_chrono_you() et affiche_chrono_sys() (fonctions de base)
Fonctions complémentaires à demarre_chrono_you() et demarre_chrono_sys(), utilisées pour le debug mode.
Elles retournent le temps utilisé par le script à l'instant où on les lance.
*/
function affiche_chrono_you($debut)
{
$end=demarre_chrono_you();
$time_taken= ($end - $debut);
return $time_taken;
}
function affiche_chrono_sys($debut)
{
$end=demarre_chrono_sys();
$time_taken= ($end - $debut);
return $time_taken;
}
/*
Fonction form_recherche() (fonction de base)
Cette fonction affiche le formulaire basique qui servira à lancer une recherche,
avec une sélection automatique de l'option choisie pour la recherche.
Elle permet également de retraiter ce qui a été entré dans le formulaire,
notamment pour retirer du code ou autre contenu qui pourrait être dangereux.
*/
function form_recherche($contenu,$type)
{
$contenu=strip_tags($contenu);
$contenu=trim($contenu);
$contenu=htmlspecialchars($contenu,ENT_COMPAT);
echo(" ");
}
/*
Fonction explore() (fonction de base)
Cette fonction liste tous les sous-dossiers qu'elle trouve à partir du chemin qui
lui est indiqué à la base. Elle prend en compte la liste des éventuels dossiers
exclus, donc aucune chance qu'ils ne se retrouvent listés, même temporairement.
*/
function explore(&$d,$exclu)
{
foreach($d as $cle=>$lien)
{
$fp=opendir("$lien");
while($file = readdir($fp))
{
if($file!='.' && $file!='..')
{
$verif=$lien."/".$file;
if(
is_dir($verif)
&& !(in_array($verif, $d))
&& !(in_array($verif, $exclu)))
{
$d[]=$verif;
}
}
}
closedir($fp);
}
}
/*
Fonction affiche_resultats() (fonction de base)
Comme son nom l'indique, elle sert à afficher les résultats
Elle affiche aussi la barre de navigation au besoin pour voir les pages précédentes ou suivantes
*/
function affiche_resultats(
$start,
$maxi,
$nb_resultats,
$nb_fichiers,
$tableau_resultats,
$page,
$blork,
$type,
$rs,
$fich,
$mot_supprime
)
{
// On définit les différentes variables qui serviront pour la barre de navigation
$finstart=intval($nb_resultats/$maxi);
// Affichage du message de résultat
echo("
Résultats de votre recherche pour ".$blork."
".$nb_resultats." ".$rs." sur ".$nb_fichiers." ".$fich.".
$mot_supprime");
if($nb_resultats<=0)
{
echo("
");
}
else
{
// On sélectionne les résultats correspondants à la page en cours et on les affiche
for($i=$start*$maxi; $i<$start*$maxi+$maxi; $i++)
{
if($i>=$nb_resultats){ break; }
echo("
".($i+1)." - ".$tableau_resultats[$i]."
");
}
// Et si on a trop de résultats par rapport au nombre à afficher dans une seule page
// on met la ou les barre(s) de navigation correspondante(s)
if($nb_resultats>$maxi)
{
echo("
");
// Résultats précédents
if($start>=1)
{
echo("<< Résultats précédents");
}
// Barre centrale
echo(" | ");
// Résultats suivants
if($_GET["start"]<$finstart)
{
echo("Résultats suivants >>");
}
echo("
");
}
}
}
/*
Fonction debug_mode() (fonction de base)
Cette fonction affiche les infos relatives au debug mode, s'il a été activé.
A noter que le header et le footer ne sont pas inclus lorsque le debug mode est activé,
afin de voir si le problème vient bien du script en lui-même. Si ce n'est pas le cas,
il est très probable que ce soit le code mis dans un de ces deux fichiers qui provoque des bugs.
*/
function debug_mode($config,$chrono)
{
if($config!="oui")
{
;
}
else
{
// Debug mode
echo("
******************************************************
* DEBUG MODE
******************************************************
");
// Chronos
echo("
*********** Chronos ***********
");
foreach($chrono as $cle=>$resultat)
{
echo("
".$cle.": ".$resultat."");
}
// Ressources
echo("
*********** Ressources ***********
");
if(function_exists("getrusage"))
{
$ze_data=getrusage();
// Taille de la mémoire swap
echo("
Taille mémoire swap // ".$ze_data["ru_nswap"]."");
// Nombre de pages mémoire utilisées
echo("
Pages mémoire utilisées // ".$ze_data["ru_majflt"]."");
}
if(function_exists("memory_get_usage"))
{
$ze_memoire=memory_get_usage();
echo("
Mémoire utilisée par PHP // ".$ze_memoire."");
}
// Fonctions
echo("
*********** Fonctions ***********
");
$func_use=get_defined_functions();
while (list($key, $val) = each($func_use['user']))
{
echo("
".$key." => ".$val."");
}
// Variables
echo("
*********** Variables ***********");
// GET
echo("
// GET");
while (list($key, $val) = each($_GET))
{
echo("
".$key." => ".$val."");
}
// POST
echo("
// POST");
while (list($key, $val) = each($_POST))
{
echo("
".$key." => ".$val."");
}
// COOKIE
echo("
// COOKIE");
while (list($key, $val) = each($_COOKIE))
{
echo("
".$key." => ".$val."");
}
// SESSION
echo("
// SESSION");
while (list($key, $val) = each($_SESSION))
{
echo("
".$key." => ".$val."");
}
// FICHIERS INCLUS
echo("
// FICHIERS INCLUS");
$included_files=get_included_files();
while (list($key, $val) = each($included_files))
{
echo("
".$key." => ".$val."");
}
// SERVEUR
echo("
// SERVEUR");
while (list($key, $val) = each($_SERVER))
{
echo("
".$key." => ".$val."");
}
// PHPINFO
echo("
*********** PHPinfo ***********
");
phpinfo();
echo("
******************************************************
* FIN DU DEBUG MODE
******************************************************
");
}
}
/*
Fonction debug_footer_basta() (fonction de base)
Une fonction très simple pour lancer le debug mode, mettre le footer et stopper le script
*/
function debug_footer_basta($config,$chrono)
{
// On lance le debug mode (ne s'éxécute que si demandé dans le fichier config)
debug_mode($config,$chrono);
// On met le footer si le debug mode est désactivé
if($config=="oui")
{
echo("