// // This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. // // To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/1.0/ // // or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. // // Francais (brouillon): http://creativecommons.org/projects/international/fr/translated-license // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Gestion des URLs // v0.2.4 // Classe qui gère les URLs class redirection { // Type d'URLS à gérer // "dom" => http://login.monsite.com/ // "dir" => http://www.monsite.com/login/ var $type_url = "dom"; var $cache_urls = array(); var $cache_urls_loaded = FALSE; function _getIDfromURL($url) { if(!$this->cache_urls_loaded) $this->_loadCacheUrls(); if(array_key_exists($url,$this->cache_urls)) return $this->cache_urls[$url]; return FALSE; } function _loadCacheUrls() { $file = file("datas/cache/urls.txt"); $this->cache_urls = unserialize(implode("",$file)); } // On récupère l'id unique du journal function get_id() { #$id = $this->_getIDfromURL($this->domain); if(!$id) { if($this->type_url == "dom") { $url = $this->domain; $id = substr($url,0,strpos($url,".")); } else { $id = substr($this->url,1); $id = substr($id,0,strpos($id,"/")); } } $this->id = $id; if(!file_exists("datas/cache/".$id)) return FALSE; return $id; } // On récupère l'URL demandée function get_url() { if($this->type_url == "dom") return $this->url; else { $url = substr($this->url,1); $url = substr($url,strpos($url,"/")); return $url; } } // Si la page existe en cache on renvoie son URI function is_cache($id,$url) { if(substr($url,-1) == "/") $url = substr($url,0,-1); $url = strtr(substr($url,1),array("/"=>"_","~"=>"-")); $uri = "datas/cache/".$id."/".$url; if(file_exists($uri)) return $uri; return FALSE; } // Message d'erreur function erreur($statut) { $url = $this->url; $id = $this->id; include_once("erreur.php"); exit; } function what_is($url) { if(substr($url,0,1) == "/") $url = substr($url,1); if(substr($url,-1) == "/") $url = substr($url,0,-1); $url = explode("/",$url); if($url[0] == "backend" && $url[1] == "forum") { $rec['type'] = "rss_forum"; } elseif($url[0] == "rss" || $url[0] == "backend") { $rec['type'] = "rss"; } elseif(($url[0] == "forum") && empty($url[1])) { $rec['type'] = "forum_page"; $rec['id'] = "0"; } elseif(($url[0] == "forum") && strpos($url[1],"-")) { $rec['type'] = "forum_message"; $rec['id'] = $url[1]; } elseif(($url[0] == "forum") && substr($url[1],0,1) == "+") { $rec['type'] = "forum_page"; $rec['id'] = substr($url[1],1); } elseif(is_numeric($url[0]) && is_numeric($url[1]) && (strlen($url[2]) >= 2)) { $rec['type'] = "ecrit"; $rec['id'] = implode("/",$url); } elseif(is_numeric($url[0]) && is_numeric($url[1])) { $rec['type'] = "mois"; $rec['id'] = $url[0].$url[1]; #if(substr($url[1],0,1) == "~") $rec['debut'] = substr($url[1],1); } elseif(empty($url[0])) { $rec['type'] = "accueil"; } return $rec; } function show_toolbar($texte) { $tag = ''; $f = str_replace("",$tag,$texte); $tag = ' '; $f = str_replace("",$tag,$f); return $f; } function open_cache($cache) { $f = file($cache); $f = implode("",$f); return $f; } } // Initialisation des variables $redir = new redirection(); $redir->url = $_SERVER['REQUEST_URI']; $redir->domain = $_SERVER['HTTP_HOST']; $id = $redir->get_id(); $url = $redir->get_url(); $journal_id = $id; if($id == "public") { header("location: /ecrire/"); exit; } // Si journal restreint if(file_exists("datas/textes/".$id."/restreint")) { include_once("classes/config.inc.php"); include_once("classes/sessions.php"); $sessions = new sessions(); if(!$sessions->connected()) $redir->erreur("NOT_ALLOWED"); if(!$sessions->is_allowed($id,$url)) $redir->erreur("NOT_ALLOWED"); } if($redir->url == "/") $url = "/accueil"; // On regarde s'il existe une page en cache // Si c'est le cas on l'inclu directement et fin des affaires $cache = $redir->is_cache($id,$url); if($cache && !$_GET['recharger']) { header("HTTP/1.0 200 OK"); if(strpos($url,"backend")) header("Content-Type: application/rdf+xml; charset=iso-8859-1"); // if($_COOKIE['enabletoolbar'] > 0) // echo $redir->show_toolbar($redir->open_cache($cache)); // else echo file_get_contents($cache); exit; } // Sinon on commence à chercher un peu à quoi correspond l'URL... // On inclut ce qui va nous servir include_once("classes/config.inc.php"); include_once("classes/journal.php"); if(!$journal) { $journal = new journal(); $journal->infos = $journal->get_infos($id); } // Si on peux pas récupérer le journal c'est qu'il n'existe pas if(!$journal->infos) $redir->erreur("NO_JOURNAL"); // Si journal interdit on dit va voir ailleurs if($journal->infos['statut'] == "interdit") $redir->erreur("FORBIDDEN"); // Si le forum est pas activé if(strstr($redir->url,"forum") && $journal->infos['forum'] == "non") $redir->erreur("NOT_FOUND"); // On tente de savoir ce qu'est ladite URL $what = $redir->what_is($redir->url); // Si le type est connu on continue if(in_array($what['type'],array("ecrit","mois","forum_page","forum_message","rss","rss_forum","accueil"))) { // On inclut les fichiers qui vont bien include_once("classes/ecrits.php"); include_once("classes/rendu.php"); include_once("classes/fonctions.php"); include_once("classes/cache.php"); include_once("classes/forum.php"); // On initialise les classes et variables $ecrits = new ecrits(); $forum = new forum(); $ecrits->chemin = "datas/"; $journal->resume = $journal->infos($id); $ecrits->mois = $ecrits->liste_mois($id); $journal->resume['mois'] = $ecrits->mois; $journal->resume['self'] = $_SERVER['REQUEST_URI']; $rendu = new rendu(); $rendu->chemin = "datas/"; $cache = new cache(); $cache->chemin = "datas/"; $cache->url = strtr(substr($url,1),array("/"=>"_","~"=>"-")); $journal->resume['url'] = str_replace("[ID]",$journal->resume["id"],$cfg["url_tpl"]); if(substr($cache->url,-1) == "_") $cache->url = substr($cache->url,0,-1); // Si c'est un écrit qui est demandé if($what['type'] == "ecrit") { // On récupère l'id de l'écrit $ecrit = $ecrits->getFromUri($journal_id,$what['id']); $GLOBALS['id_ecrit'] = $ecrit['id']; // Si pas d'id c'est qu'il n'existe pas if(!$ecrit) $redir->erreur("NOT_FOUND"); // Si l'écrit est privé on a pas le droit de venir if($ecrit['statut'] == "prive") $redir->erreur("FORBIDDEN"); if($ecrit['valide'] != "oui") $redir->erreur("NOT_FOUND"); // Rendu de la page de l'écrit $page = $rendu->skel_ecrit($journal->resume,$ecrit); // On met la page ainsi créée en cache $cache->creer($journal_id,$cache->url,$page); } // Si c'est un index des écrits d'un mois elseif($what['type'] == "mois") { // Si pas de liste alors pas d'écrit ce mois-ci if(!in_array($what['id'],$ecrits->mois)) $redir->erreur("NOT_FOUND"); $journal->resume['select_mois'] = $what['id']; // On crée le rendu de la page $page = $rendu->skel_mois($journal->resume); // On met en cache le rendu $cache->creer($journal_id,$cache->url,$page); } // Si c'est la page d'accueil du journal elseif($what['type'] == "accueil") { // On crée le rendu de la page $page = $rendu->skel_accueil($journal->resume); // On met en cache le rendu $cache->creer($journal_id,"accueil",$page); } // Si c'est un index du forum elseif($what['type'] == "forum_page") { // On récupère la liste des messages $forum->parpage = 1; $liste = $forum->getList($journal_id,0); // Si pas de liste alors 404 if(count($liste) < 1) $redir->erreur("NO_MESSAGE"); $GLOBALS['debut_liste'] = $what['id']; // On crée le rendu de la page $page = $rendu->skel_forum_page($journal->resume,$liste); $cache->creer($journal_id,$cache->url,$page); } elseif($what['type'] == "forum_message") { // On récupère le contenu du message $message = $forum->getPostFromUri($journal_id,$what['id']); if(!$message) $redir->erreur("NOT_FOUND"); $id = $message['id']; // Rendu de la page de l'écrit $page = $rendu->skel_forum_message($journal->resume,$message); // On met la page ainsi créée en cache $cache->creer($journal_id,$cache->url,$page); } elseif($what['type'] == "rss_forum") { include_once("classes/rss.php"); include_once("classes/format.php"); $rss = new RSS(); $rss->format = new FormatHTML(); $page = $rss->journal_forum($journal_id); $cache->creer($journal_id,"backend_forum",$page); } elseif($what['type'] == "rss") { include_once("classes/rss.php"); header("Content-Type: application/rdf+xml; charset=iso-8859-1"); $rss = new RSS(); $page = $rss->journal_ecrits($journal_id); $cache->creer($journal_id,"backend",$page); } header("HTTP/1.0 200 OK"); if($_COOKIE['enabletoolbar'] > 0) $page = $redir->show_toolbar($page); echo $page; } else $redir->erreur("NOT_FOUND"); ?>