'Mon wiki', 'cache'=>'light', 'urls'=>'get', 'theme'=>'default', 'users_register' => 'yes', 'mail_from' => '');
var $defaultGroups = array('admin' => array('name'=>'Administrateurs', 'ALL'=>1),
'guest' => array('name'=>'Visiteurs', 'EDIT'=>1, 'INDEXES'=>1),
'members' => array('name'=>'Membres', 'EDIT'=>1, 'INDEXES'=>1));
var $defaultPermissions = array('INDEXES' => "Voir l'index d'une catégorie, ou du wiki", 'EDIT' => "Editer les pages",
'RENAME' => "Renommer les pages", 'DELETE' => "Supprimer les pages",
'LOCK' => "Bloquer les pages en édition", 'CONFIG' => "Accéder à la configuration du wiki",
);
var $config;
var $sessionStarted = false;
var $version = '0.7.0';
// Ou peut-être _data/pages/nom_page/ avec: cache, raw, html, metas, r1, r2, r3, etc
var $createDirs = array('_data', '_data/pages', '_data/cache', '_data/meta', '_data/media', '_data/users');
var $logged = null;
function _initSession()
{
if(!empty($this->sessionStarted)) return true;
@ini_set('session.use_only_cookies', 1);
@session_start();
if(empty($_SESSION[$this->cacheName])) $_SESSION[$this->cacheName] = array();
$this->sessionStarted = true;
return true;
}
function _putCache($name, $value)
{
$_SESSION[$this->cacheName][$name] = $value;
}
function _getCache($name)
{
if(empty($_SESSION[$this->cacheName][$name])) return false;
return $_SESSION[$this->cacheName][$name];
}
function _writeFile($file, $content)
{
$fp = @fopen($file, 'w');
if(!$fp) return false;
fputs($fp, $content);
fclose($fp);
}
function _genPassword()
{
$acceptedChars = 'abcdefgijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$max = strlen($acceptedChars)-1;
$password = '';
$length = mt_rand(5, 10);
for($i=0; $i < $length; $i++)
{
$password.= $acceptedChars{mt_rand(0, $max)};
}
return $password;
}
function _getWikiURL()
{
$url = 'http://'.$_SERVER['HTTP_HOST'];
$url.= ereg_replace('/$', '', dirname($_SERVER['SCRIPT_NAME']));
return $url;
}
function _sendMail($to, $subject, $content)
{
if(empty($this->config['mail_from'])) return true;
$name = stripslashes($this->config['name']);
$headers = 'From: "'.$name.'" <'.$this->config['mail_from'].">\n".
'Reply-To: '.$this->config['mail_from']."\n".
'Return-Path: '.$this->config['mail_from']."\n";
$signature = "\n\n--\n ".$name."\n ".$this->getWikiURL()."\n";
if(!@mail($to, $subject, $content.$signature, $headers)) return false;
return true;
}
function getUserDatas($user)
{
$user = trim($user);
if(!ereg('^[a-z0-9]{3,30}$', $user)) return false;
if($this->_getCache('user_'.$user) != false)
return $this->_getCache('user_'.$user);
$ini = @parse_ini_file('_data/users/'.$user);
if(empty($ini) || !is_array($ini)) return false;
$this->_putCache('user_'.$user, $ini);
return $ini;
}
function getUserInfo($info)
{
$this->_initSession();
$user = $this->getUserDatas($_SESSION[$this->cookieName.'_logged']);
if(!empty($user[$info])) return $user[$info];
else return '';
}
function addUser($login, $password="", $email, $group='membres')
{
if(!ereg('^[a-z0-9]{3,30}$', $login)) return 'BAD_LOGIN';
if(!empty($password) && !ereg('^[a-zA-Z0-9_-]{3,30}$', $password)) return 'BAD_PASSWORD';
if(!ereg('^[a-z0-9_\+-]+(\.[a-z0-9_\+-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,4})$', $email)) return 'BAD_EMAIL';
if(empty($password)) $password = $this->_genPassword();
$ini = "login=".$login."\npassword=".$password."\nemail=".$email."\ngroup=".$group."\n";
$this->_writeFile('_data/users/'.$login, $ini);
$this->_sendMail($email, 'Inscription au wiki "'.stripslashes($this->config['name']).'"',
"CECI EST UN MESSAGE AUTOMATIQUE\n\n".
"Vous vous êtes inscrit au wiki avec les identifiants suivants:\n".
" - Login: ".$login."\n".
" - Mot de passe: ".$password."\n\n".
"Vous pouvez désormais vous y connecter avec ces identifiants.\n");
return true;
}
function login($login, $password, $permanent=false)
{
$user = $this->getUserDatas($login);
if(!$user) return false;
if($user['login'] != $login) return false;
if($user['password'] != $password) return false;
$this->_initSession();
$_SESSION[$this->cookieName.'_logged'] = $login;
if(!empty($permanent))
{
@setcookie($this->cookieName.'_permanent', $login.'/'.md5($login.$password), time() + (3600 * 24 * 365), '/');
}
return true;
}
function isLogged()
{
if($this->logged === true) return true;
elseif($this->logged === false) return false;
$this->_initSession();
if(!empty($_SESSION[$this->cookieName.'_logged'])) {
$this->logged = true;
return true;
}
if(!empty($_COOKIE[$this->cookieName.'_permanent']))
{
$login = explode('/', $_COOKIE[$this->cookieName.'_permanent']);
$user = $this->GetUserDatas($login[0]);
if(md5($user['login'].$user['password']) == $login[1])
{
$_SESSION[$this->cookieName.'_logged'] = $login[0];
$this->logged = true;
return true;
}
}
$this->logged = false;
return false;
}
function logout()
{
$this->_initSession();
@setcookie($this->cookieName.'_permanent', '', time() - (3600 * 24 * 365), '/');
$_SESSION = array();
@session_unset();
@session_destroy();
return true;
}
function errorRedir($page, $msg)
{
$this->_initSession();
$_SESSION['errorMessage'] = $msg;
header('location: '.$this->PageURL($page));
exit;
}
function getError()
{
$this->_initSession();
if(empty($_SESSION['errorMessage'])) return false;
$msg = $_SESSION['errorMessage'];
unset($_SESSION['errorMessage']);
return $msg;
}
function haveAccess($domain)
{
$groups = $this->getGroups();
if($this->isLogged()) $currentGroup = $this->getUserInfo('group');
else $currentGroup = 'guest';
$rights = $groups[$currentGroup];
if(!empty($rights['ALL'])) return true;
if(!empty($rights[$domain])) return true;
return false;
}
function getGroups()
{
if(!empty($this->groups)) return $this->groups;
$groups = parse_ini_file('_data/users/_groups', true);
$this->groups = $groups;
return $groups;
}
function saveGroups($groups)
{
$ini = '';
foreach($groups as $group=>$rights)
{
$ini .= '['.$group."]\n";
foreach($rights as $name=>$value)
{
$ini .= "$name = $value\n";
}
$ini .= "\n";
}
$this->_writeFile('_data/users/_groups', $ini);
return true;
}
function isWritable()
{
if(!is_writable('.')) return false;
foreach($this->createDirs as $dir)
{
if(!file_exists($dir)) continue;
if(!is_writable($dir)) return false;
if(!is_dir($dir)) return false;
}
return true;
}
function writeConfig($config)
{
$file[] = 'version.'";';
$file[] = '?>';
$file = implode("\n",$file);
$fp = @fopen("config.inc.php","w");
if(!$fp) return false;
fputs($fp,$file);
fclose($fp);
return true;
}
function initPaths()
{
foreach($this->createDirs as $dir)
{
if(file_exists($dir) && is_dir($dir)) continue;
if(!@mkdir($dir)) return false;
}
$this->WriteHtaccess("_data/pages", 'lock');
$this->WriteHtaccess("_data/cache", 'lock');
$this->WriteHtaccess("_data/users", 'lock');
$this->WriteHtaccess("_data/meta", 'lock');
$this->WriteHtaccess(".", 'redir');
return true;
}
function writeHtaccess($path,$type)
{
$fp = @fopen("$path/.htaccess","w");
if(!$fp) return false;
if($type == "lock") {
$content = "Order deny,allow\nAllow from none\nDeny from all\n";
}
elseif($type == "redir")
{
$base = ereg_replace("/$","",dirname($_SERVER['SCRIPT_NAME']));
$content = "# For 404 error redirect:\n\nErrorDocument 404 {$base}/index.php\n";
}
fputs($fp,$content);
fclose($fp);
return true;
}
function getPageName($page)
{
$page = urldecode($page);
$page = strtr($page,"àâäéèêëçùûüôöÀÂÉÈÊËÇÙÛÜÔÖ /:","aaaeeeecuuuooAAEEEECUUUOO_%%");
$page = eregi_replace("[^a-z0-9_%]","",$page);
$page = strtolower($page);
return $page;
}
function getPageTitle($page,$showPath=false)
{
$page = str_replace("_"," ",$page);
if(strpos($page,"%")) {
if($showPath) $page = str_replace('%','/',$page);
else { $page = explode('%',$page); $page = $page[count($page)-1]; }
}
$page = ucfirst($page);
return $page;
}
function getCategoryIndex($page)
{
$cat = explode("%",$page);
unset($cat[count($cat)-1]);
$cat = implode("%",$page);
$dir = opendir("_data/pages/");
while($file = readdir($dir))
{
if(strpos($dir,$cat)) echo strpos($dir,$cat)."
";
}
}
function getIndex($prefix="", $count=true)
{
$dir = opendir("_data/pages/");
while($file = readdir($dir))
{
if(!empty($prefix)) if(!ereg("^$prefix", $file)) continue;
if(substr($file, 0, 1) == ".") continue;
if(!empty($prefix)) $file = str_replace($prefix, '', $file);
$files[] = $file;
}
if(empty($files) || count($files) < 1) {
if(empty($prefix)) return '
Aucune page dans le wiki.
'; else return 'Aucune page dans cette catégorie.
'; } natcasesort($files); if($this->haveAccess('DELETE') && empty($prefix)) $admin = true; $opened = false; $out = ''; foreach($files as $file) { if(($letter = strtoupper(substr($file,0,1))) != $opened) { if($opened) $out.= "\n"; $out.= ''.count($files).' pages trouvées.
'; $out2.= ''.implode(' - ',$let).'