, license GNU/GPL, www.gnu.org // v0.4b2 class wiki { // Tags gérés par le wiki, à modifier si besoin var $tags = array( "{{{"=>"

","}}}"=>"

","{{"=>"","}}"=>"","{"=>"","}"=>"","----"=>'
', '[url="'=>'',"[/url]"=>"","[u]"=>"","[/u]"=>"", "[img]"=>''" border="0" alt="" />','[img|right]'=>'-]+)'\] = \"([^\"]+)\";){1,}\$","\?>\$"); var $version = "0.4b2"; var $txt = array( "perms"=>"Vous n'avez pas les permissions pour écrire dans ce répertoire. Les permissions sont actuellement [perms] alors qu'elles devraient être 777.", "mkdir"=>"Impossible de créer les répertoires pour faire fonctionner le wiki. Vérifiez les permissions, elle devraient être en 777.", "inconnu"=>"Erreur inconnue. Peut-être est-ce dû à un problèmes de permissions.", "ask_pass"=>"Cet espace est réservé à l'administrateur du site. Si vous êtes cette personne, donnez votre mot de passe dans le champ ci-dessous et cliquez sur Connexion, sinon allez voir ailleurs.", "logout"=>"Vous avez été déconnecté. Cliquez sur le bouton ci-dessous pour vous reconnecter.", "maj" => array("0.3.x" => "La version de WikiKubbe qui est installée est la 0.3.x. Pour passer à la nouvelle version 0.4 de WikiKubbe vous devez effectuer une mise à jour.\n\nCette mise à jour va créer un répertoire http://votresite.com/wiki.docs/ si votre wiki est à l'adresse http://votresite.com/wiki/.\n\nCeci vous permettra de bénéficier des nouvelles fonctionnalités de WikiKubbe comme la gestion intuitive des images ou des visuels.") ); function dekod($c) { if(!empty($c)) return gzinflate(base64_decode($c)); } function filtre($texte) { $texte = htmlentities(stripslashes($texte)); $texte = eregi_replace("[\n\r\t]+\[code\]","[code]",$texte); $texte = eregi_replace("\[/code\][\n\r\t]+","[/code]",$texte); $i=1; $pos = strpos($texte,"[code]"); while(is_numeric($pos)) { $code[$i] = substr($texte,$pos+6,strpos($texte,"[/code]") - ($pos+6)); $texte = str_replace("[code]".$code[$i]."[/code]","",$texte); $pos = strpos($texte,"[code]"); $i++; } $texte = eregi_replace("(^|[ \t\r\n])((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero):[A-Za-z0-9/](([A-Za-z0-9$_.+!*(),;/?:@&~=-])|%[A-Fa-f0-9]{2})+)","\\0",$texte); $texte = eregi_replace("(^|[ \t\r\n])([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+)", "\\0", $texte); $texte = ereg_replace("(^|[ \t\r\n])(([A-Z]+[a-z]+){2,})","\\1\\2",$texte); $texte = strtr($texte,$this->tags); for($i=1;$i <= count($code); $i++) { $code[$i] = ereg_replace("(\n| ) ","\\1  ",$code[$i]); $texte = str_replace("",'

'.trim($code[$i]).'

',$texte); } $texte = str_replace("@","@",$texte); return nl2br($texte); } // Affichage d'une page (template) // Array( "titre", "texte", "form" => "action du formulaire", "bouton" => "intitulé du bouton", // "infos" => "Infos bas de page", "page" => "nom de la page"); function affiche_page($rec) { //$titre,$texte,$form,$bouton,$infos,$page) { $template = << #TITRE #TRANSITION

#TITRE

#TEXTE
#INFOS
ENDOFFILE; if($rec[page] == "PageDaccueil") $rec[titre] = $this->conf[nom_wiki]; if(file_exists($this->chemin."page.html")) { $f = file($this->chemin."page.html"); $template = implode($f); } if(empty($rec[transition])) $rec[transition] = "\n"; $template = str_replace("#TITRE",htmlentities(stripslashes($rec[titre])),$template); $template = str_replace("#INFOS",$rec[infos],$template); $template = str_replace("#FORM",$rec[form],$template); $template = str_replace("#BOUTON",htmlentities(stripslashes($rec[bouton])),$template); $template = str_replace("#TEXTE",$rec[texte],$template); $template = str_replace("#NOM_WIKI",$this->conf[nom_wiki],$template); $template = str_replace("#TRANSITION",$rec[transition],$template); return $template; } function show_conf() { if($this->conf[type] == "prive") $prive = "checked=\"checked\""; else $libre = "checked=\"checked\""; if(!empty($this->conf[ip])) $ip = "checked=\"checked\""; if(!empty($this->conf[pass])) $pass = "checked=\"checked\""; $this->conf[nom_wiki] = htmlentities(stripslashes($this->conf[nom_wiki])); $t.= <<

Type de wiki:

Authentification du wiki pour l'administration:

END; $rec = array("titre"=>"Configuration","texte"=>$t,"form"=>"./configuration","bouton"=>"Enregistrer","page"=>"configuration", "infos"=>"Aide de WikiKubbe"); echo $this->affiche_page($rec); } function do_conf() { if(empty($_POST[nom])) return $this->show_error("Vous n'avez pas spécifié le nom de votre wiki.","configuration"); elseif($_POST[pass1] == "oui" && empty($_POST[pass2])) return $this->show_error("Vous n'avez pas spécifié de mot de passe alors que vous avez coché la se correspondante.","configuration"); elseif($_POST[ip1] == "oui" && empty($_POST[ip2])) return $this->show_error("Vous n'avez pas spécifié d'adresse IP alors que vous avez coché la se correspondante.","configuration"); $fp = @fopen($this->datas."config.inc.php","w"); if(!$fp) return $this->show_error($this->txt[inconnu]); $cont = ""; fputs($fp,$cont); fclose($fp); return TRUE; } function show_error($t,$p="") { $t = nl2br(htmlentities(stripslashes($t))); $rec = array("titre"=>"Erreur","texte"=>$t,"form"=>"./{$p}","bouton"=>"Retour","page"=>"rien", "infos"=>"Aide de WikiKubbe"); echo $this->affiche_page($rec); return FALSE; } function do_inst() { $perms = decoct(fileperms(".")) % 1000; if($perms < 755) return $this->show_error(str_replace("[perms]",$perms,$this->txt[perms])); $r = @mkdir(substr($this->datas,0,-1),0777); $r = @mkdir(substr($this->public,0,-1),0777); if(!$r) return $this->show_error($this->txt[mkdir]); $fp = @fopen($this->datas."version","w"); if(!$fp) return $this->show_error($this->txt[inconnu]); fputs($fp,$this->version); fclose($fp); $fp = @fopen($this->datas.".htaccess","w"); if(!$fp) return $this->show_error($this->txt[inconnu]); fputs($fp,"Allow from none\nDeny from All\n"); fclose($fp); return TRUE; } function show_maj($ver) { $t = $this->txt[maj][$ver]; $t = nl2br(htmlentities(stripslashes($t))); $rec = array("titre"=>"Mise à jour","texte"=>$t,"form"=>"./maj","bouton"=>"Effectuer la mise à jour","page"=>"maj", "infos"=>"Aide de WikiKubbe"); echo $this->affiche_page($rec); } function lire($page) { $f = @file($this->datas.$page.".kub"); if(!$f) return FALSE; $out = implode("",$f); $rec[date] = filemtime($this->datas.$page.".kub"); if(file_exists($this->datas.$page.".mod")) { $rec[modif] = filemtime($this->datas.$page.".mod"); $tmp = @file($this->datas.$page.".mod"); $rec[ip] = $tmp[0]; } else $rec[modif] = "1"; $rec[texte] = $out; return $rec; } function do_save($p,$txt) { $fp = @fopen($this->datas.$p.".kub","w"); if(!$fp) return FALSE; fputs($fp,$txt); fclose($fp); return TRUE; } function show_page($p) { $rec = $this->lire($p); if($rec === FALSE) $rec = array( "texte"=>"Pour écrire dans cette page cliquez sur le bouton Editer.", "date"=>"Page inexistante","infos"=>"Page inexistante"); else { $rec[texte] = $this->filtre($rec[texte]); if($this->auth == "oui") $rec[infos] = "MàJ le ".date("d/m/Y H:i",$rec[date])." - Administration"; else $rec[infos] = "Dernière mise à jour le ".date("d/m/Y H:i",$rec[date]); } $rec[form] = "./editer~".$p; $rec[bouton] = "Editer"; $rec[page] = $p; $rec[titre] = strtr($p,array("_"=>" ","."=>" / ")); echo $this->affiche_page($rec); } function edit_page($p) { if(file_exists($this->datas.$p.".lock")) $lock=TRUE; if(file_exists($this->datas.$p.".unlock")) $unlock=TRUE; if(($this->conf[type] == "prive" || $lock) && ($this->auth != "oui") && !$unlock) { $this->show_error("Cette page est protégée contre l'édition.",$p); exit; } $rec = $this->lire($p); if((($rec[modif] > 1) && ($rec[modif] > time()-3600) && ($_SERVER[REMOTE_ADDR] != $rec[ip])) && $this->auth != "oui") return $this->show_error("Cette page est déjà en train d'être modifiée par une autre personne.",$p); if($rec !== FALSE) { $fp = @fopen($this->datas.$p.".mod","w"); if($fp) { fputs($fp,$_SERVER[REMOTE_ADDR]); fclose($fp); } } $rec[texte] = " "; if($this->auth == "oui") { $t.= '
'; if($this->conf[type] == "libre") { $t.= ''; } else { $t.= ''; } $t.= 'Administration
'; } $rec[titre] = "Edition de {$p}"; $rec[form] = "./enregistrer~{$p}"; $rec[bouton] = "Enregistrer"; $rec[infos] = "Retour"; if(file_exists($this->datas."module.wysiwyg")) $rec[transition] = ''; echo $this->affiche_page($rec); } function set_lock($p,$t,$v="") { if(file_exists($this->datas.$p.".".$t)) if(empty($v)) @unlink($this->datas.$p.".".$t); else if(!empty($v)) { $fp = @fopen($this->datas.$p.".".$t,"w"); @fclose($fp); } return TRUE; } function save_page($p,$texte,$lock="",$unlock="") { @unlink($this->datas.$p.".mod"); if(empty($texte)) { @unlink($this->datas.$p.".lock"); @unlink($this->datas.$p.".unlock"); @unlink($this->datas.$p.".kub"); } else { if($this->auth == "oui") { if($_POST[lock]) $t = "lock"; else $t = "unlock"; $this->set_lock($p,$t,$_POST[$t]); } $this->do_save($p,$texte); return TRUE; } } function reset_page($p) { @unlink($this->datas.$p.".mod"); return TRUE; } function ask_pass($file="") { $rec = array("titre"=>"Administration","form"=>"./administration","bouton"=>"Connexion","page"=>"administration", "texte"=>"

".$this->txt[ask_pass]."

\n\n"); if(!empty($file)) $rec[texte].= ""; echo $this->affiche_page($rec); } function module_load($file) { //print_r(gzinflate(base64_decode($file))); $file = $this->dekod($file); $file = trim($file); $f = explode("\n",$file); foreach($f as $n=>$c) { $r = $this->module_regex[$n]; if(strpos($c,"\$module[files]") === TRUE) $r = $this->module_regex[3]; if(!eregi($r,$c)) $nok = TRUE; } if(eregi("[()]",$file) || $nok) { $this->show_error("Tentative d'installation d'un module non-conforme au standard ModuloKub. C'est peut-être une tentative de piratage de votre wiki."); exit; } $fp = @fopen($this->datas."install.tmp","w"); if($fp) { fputs($fp,$file); fclose($fp); } return TRUE; } function login($pass="",$file="") { setcookie("kubpass",$pass,0,"/"); if(!empty($pass) && $pass != $this->conf[pass]) $this->show_error("Mauvais mot de passe.","administration"); if($pass == $this->conf[pass] && !empty($file)) $this->module_load($file); return TRUE; } function admin($file="",$module="") { if(!empty($file)) $this->module_load($file); $rec = array("titre"=>"Administration","form"=>"./administration","bouton"=>"Déconnexion","page"=>"administration"); if(file_exists($this->datas."install.tmp")) { $module->nom = htmlentities(stripslashes($module->nom)); $module->description = htmlentities(stripslashes($module->description)); $rec[texte].= "

Installation de module

Vous avez téléchargé le module suivant:

Nom: {$module[name]}
Description: {$module[description]}

Voulez-vous installer ce module? Oui - Non"; } else { $rec[texte].= "

Hello chef!

"; } $rec[texte].= ""; echo $this->affiche_page($rec); } function mod_install($mod) { foreach($mod[files] as $n=>$file) { $n = str_replace("",$this->datas,$n); $n = str_replace("",$this->public,$n); //if(file_exists($n)) $file = $this->dekod($file); $fp = @fopen($n,"w"); fputs($fp,$file); fclose($fp); } @unlink($this->datas."install.tmp"); return TRUE; } } // FIN DE LA CLASSE WIKI //////////////////////////////////////////////////////////////////////////// $wiki = new wiki(); $fichier = basename($_SERVER[SCRIPT_FILENAME]); $path = $_SERVER[PATH_INFO]; if(substr($path,0,1) != "/") header("location: {$fichier}/PageDaccueil"); elseif($path == "/") header("location: ./PageDaccueil"); $wiki->datas = basename($fichier).".pages/"; $wiki->public = basename($fichier).".docs/"; $page = substr($path,1); if(strchr($page,"~")) { $t = explode("~",$page); $page = $t[1]; $mode = $t[0]; } if(file_exists($wiki->datas."config.inc.php")) { require_once($wiki->datas."config.inc.php"); $wiki->conf = array("nom_wiki"=>$nom_wiki,"type"=>$type); if(!empty($ip)) $wiki->conf[ip] = $ip; if(!empty($pass)) $wiki->conf[pass] = $pass; } else { $page = "configuration"; $wiki->conf[nom_wiki] = "WikiKubbe"; $inst = "oui"; } if(!file_exists($wiki->datas."version") || !is_dir($wiki->public)) $page = "maj"; if(!is_dir($wiki->datas)) $page = "installation"; if((($_COOKIE[kubpass] == $wiki->conf[pass]) && (($wiki->conf[ip] == $_SERVER[REMOTE_ADDR]) || empty($wiki->conf[ip]))) || (empty($wiki->conf[pass]) && ($wiki->conf[ip] == $_SERVER[REMOTE_ADDR]))) $wiki->auth = "oui"; // ORIENTION VERS LA BONNE PAGE //////////////////////////////////////////////////////////////////////////// if($page == "configuration") { if($auth != "oui" && !$inst) { $wiki->show_error("Vous n'avez pas l'autorisation de configurer le wiki.","PageDaccueil"); exit; } if($_POST) { if(!$wiki->do_conf()) exit; else header("location: ./PageDaccueil"); } else $wiki->show_conf(); } elseif($page == "installation") { $wiki->do_inst(); exit; } elseif($page == "maj") { if($_POST) $wiki->do_maj("0.3.x"); else $wiki->show_maj("0.3.x"); } elseif($page == "administration") { if($_POST[logout]) { $wiki->login(); $wiki->show_error($wiki->txt[logout],"administration"); } elseif($_POST[pass]) { if($wiki->login($_POST[pass],$_POST[file])) header("location: ./administration"); } elseif($wiki->auth == "oui") { if(file_exists($wiki->datas."install.tmp")) include_once($wiki->datas."install.tmp"); $wiki->admin($_POST[file],$module); } elseif($wiki->auth != "oui" && !empty($wiki->conf[pass])) $wiki->ask_pass($_POST[file]); else $wiki->show_error("Vous n'avez pas l'autorisation d'accéder à cette page.","PageDaccueil"); } elseif($page == "mod_install" && $wiki->auth == "oui") { if(!file_exists($wiki->datas."install.tmp")) $wiki->show_error("Pas de module de téléchargé."); else { include_once($wiki->datas."install.tmp"); $wiki->mod_install($module); header("location: ./administration"); } } else { if(!ereg("^{$wiki->regex}$",$page)) { $wiki->show_error("Erreur 404\nCette page est introuvable.","PageDaccueil"); exit; } if($mode == "enregistrer") { $wiki->save_page($page,$_POST[texte],$_POST[protec],$_POST[unprotec]); header("location: ./{$page}"); } elseif($mode == "editer") $wiki->edit_page($page); elseif($mode == "raz") { $wiki->reset_page($page); header("location: ./{$page}"); } else $wiki->show_page($page); } ?>