// ------------------------------------------------------------------------- //
// IBDAntiHotLinks - Script de protection contre les liens directs vers les  //
//                   fichiers d'un serveur web.                              //
// ------------------------------------------------------------------------- //
// Copyright (C) 2010  Matthieu SARTER         //
//                       http://matthieu.sarter.fr/php                       //
// ------------------------------------------------------------------------- //
//               Infobidouille                //
// ------------------------------------------------------------------------- //
//                                 LISEZ-MOI                                 //
// ------------------------------------------------------------------------- //


INSTALLATION
------------
- décompressez l'archive,
- copiez le contenu du répertoire "src" sur votre serveur web à l'emplacement
  de votre choix,
- configurez votre serveur web pour l'utilisation d'IBDAntiHotLinks (voir plus
  bas).


CONFIGURATION
-------------
Editez le fichier "src/config.inc.php" pour modifier les paramètres suivants :
- IBDLIBS : chemin absolu vers le répertoire contenant les librairies
            IBDInfosReferant et IBDInfosNavigateur,
- ROOTPATH : chemin absolu vers le répertoire racine des ressources à protéger,
- ERROR403 : chemin relatif vers le code PHP à utiliser pour les erreurs 403,
- ERROR404 : chemin relatif vers le code PHP à utiliser pour les erreurs 404.


CONFIGURATION DU SERVEUR WEB
----------------------------
Le serveur web doit être configuré pour rediriger les requêtes sur les
ressources à protéger vers IBDAntiHotLinks, avec le chemin des ressources en
paramètres (askedFile).

Exemple de configuration Apache, via le fichier .htaccess et mod_rewrite :
RewriteCond %{HTTP_REFERER} !^(http://www.votresite.tld/.*)$ [NC]
RewriteRule ^images/(.*)\.(png|jpg|jpe|jpeg|gif)$     IBDAntiHotLinks/antiHotLinks.php?askedFile=$1.$2 [L]

Cet exemple redirige toutes les requêtes vers des images dont le référant est
non vide et différent de votresite.tdl vers IBDAntiHotLinks.

Exemple de configuration lighttpd, via le fichier de configuration du serveur :
$HTTP["referer"] !~ "(^$|^http://www.votresite.tld/.*)" {
    url.rewrite = ("^/images/(.*)\.(png|jpg|jpe|jpeg|gif)$" => "IBDAntiHotLinks/antiHotLinks.php?askedFile=$1.$2")
}


DÉFINITION DES RÈGLES DE TRAITEMENT
-----------------------------------
Les règles de traitement sont stockées dans le tableau $AHLRules.
Chaque élément du tableau est lui même un tableau pouvant contenir les éléments
suivant :
- patternFile : si le fichier demandé correspond à cette expression régulière,
                la règle sera appliquée,
- patternAgent : si le user-agent correspond à cette expression régulière, la
                 règle sera appliquée,
- patternReferer : si le référant correspond à cette expression régulière, la
                   règle sera appliquée,
- ifBot : la règle à appliquer si le user-agent correspond à un robot connu,
- ifImageSearch : la règle à appliquer si le référant correspond à un moteur de
                  recherche d'images,
- ifSearch : la règle à appliquer si le référant correspond à un moteur de
             recherche,
- defaultRule : la règle à appliquer dans tous les autres cas.

Si plusieurs des champs pattern sont présents, ils sont évalués successivements
avec une règle OU. Si aucun n'est présent, la règle est ignorée.

Si aucune des règles ne convient, la règle FORBID est appliquée.

Les règles ifBot/ifImageSearch/ifSearch/defaultRule sont des tableaux contenant
les éléments suivants :
- action : le type de règle (FORBID, ALLOW, REDIRECT ou HANDLER),
- redirectRule : les paramètres pour l'action REDIRECT,
- handlerRule : les paramètres pour l'action HANDLER.

L'action FORBID déclenche une erreur 403.
L'action ALLOW renvoie le fichier demandé.

L'action REDIRECT effectue une redirection vers une autre URL. Elle prend en
paramètre un tableau contenant les champs suivants :
- httpCode : le code HTTP à utiliser pour la redirection. Les valeurs acceptées
             sont 301 et 302. Tout autre valeur générera un code 302.
- pattern et replacement : les paramètres à passer à preg_replace pour générer
                           l'URL de redirection à partir du chemin du fichier
                           demandé.
                           
L'action LOCALREDIRECT effectue une redirection vers un fichier local. Elle prend
en paramètre un tableau contenant les champs suivants :
- pattern et replacement : les paramètres à passer à preg_replace pour générer
                           l'URL de redirection à partir du chemin du fichier
                           demandé.
- mime : le type MIME du fichier vers lequel on redirige. Si ce paramètre n'est
         pas renseigné, le type MIME sera déterminé automatiquement.

Sur les règles REDIRECT et LOCALREDIRECT, si replacement n'est pas renseigné, la
règle est ignorée. Si pattern n'est pas renseigné, la redirection est faite vers
replacement quelque soit le fichier demandé.

L'action HANDLER permet de définir une règle de traitement plus complexe,
stockée dans un fichier PHP externe. Elle prend en paramètre un tableau
contenant les champs suivants :
- file : le chemin relatif vers le fichier PHP contenant la fonction de
         traitement,
- func : le nom de la fonction de traitement. Celle-ci doit prendre en
         paramètre un unique paramètre, le chemin du fichier demandé.
         
Si un de ces champ contient une valeur incorrecte ou est non renseigné, la
règle est ignorée. Un troisième champ optionnel (redirectRule). Il contient
les mêmes paramètres que pour l'action REDIRECT. Si ce champ est défini, cette
règle sera exécutée si le handler rend la main.


HANDLER DOTCLEAR
----------------
Ce handler est fourni à titre d'exemple. Si les ressources que vous voulez
protéger font partie d'un blog Dotclear, ce handler vous permettra de rediriger
automatiquement les personnes accédant aux ressources vers un billet
référencant la ressource protégée.
Si plusieurs billets correspondent, l'un deux est choisi, de façon aléatoire.
Si votre blog contient des billets en plusieurs langues, la redirection se fera
en privilégant les billets rédigés dans les langues acceptées par le visiteur.