329 lines
10 KiB
PHP
329 lines
10 KiB
PHP
<?php
|
||
/*
|
||
$Id: m_hta.php,v 1.5 2004/11/29 17:15:37 anonymous Exp $
|
||
----------------------------------------------------------------------
|
||
AlternC - Web Hosting System
|
||
Copyright (C) 2002 by the AlternC Development Team.
|
||
http://alternc.org/
|
||
----------------------------------------------------------------------
|
||
Based on:
|
||
Valentin Lacambre's web hosting softwares: http://altern.org/
|
||
----------------------------------------------------------------------
|
||
LICENSE
|
||
|
||
This program is free software; you can redistribute it and/or
|
||
modify it under the terms of the GNU General Public License (GPL)
|
||
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.
|
||
|
||
To read the license please visit http://www.gnu.org/copyleft/gpl.html
|
||
----------------------------------------------------------------------
|
||
Original Author of file:
|
||
Purpose of file:
|
||
----------------------------------------------------------------------
|
||
*/
|
||
/**
|
||
* Classe de gestion des dossiers protégés par .htaccess apache
|
||
*
|
||
* Cette classe permet de gérer les dossiers protégés par login/pass
|
||
* par le système .htaccess d'apache.
|
||
* Copyleft {@link http://alternc.net/ AlternC Team}
|
||
*
|
||
* @copyright AlternC-Team 2002-11-01 http://alternc.net/
|
||
*
|
||
*/
|
||
class m_hta {
|
||
|
||
/*---------------------------------------------------------------------------*/
|
||
/**
|
||
* Constructeur de la classe m_webaccess, initialise le membre
|
||
*/
|
||
function m_webaccess() {
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*/
|
||
/**
|
||
* Crée un dossier à protéger (.htaccess et .htpasswd)
|
||
* @param string $dir Répertoire relatif au dossier de l'utilisateur
|
||
* @return boolean TRUE si le dossier a été protégé avec succès, FALSE sinon
|
||
*/
|
||
function CreateDir($dir) {
|
||
global $mem,$bro,$err;
|
||
$err->log("hta","createdir",$dir);
|
||
$absolute=$bro->convertabsolute($dir,0);
|
||
if (!$absolute) {
|
||
$err->raise("hta",8,$dir);
|
||
return false;
|
||
}
|
||
if (!file_exists($absolute)) {
|
||
mkdir($absolute,00777);
|
||
}
|
||
if (!file_exists("$absolute/.htaccess")) {
|
||
touch("$absolute/.htaccess");
|
||
$file = fopen("$absolute/.htaccess","r+");
|
||
fseek($file,0);
|
||
$param="AuthUserFile $absolute/.htpasswd\nAuthName \"Zone Protégée\"\nAuthType Basic\nrequire valid-user\n";
|
||
fwrite($file, $param);
|
||
fclose($file);
|
||
}
|
||
if (!file_exists("$absolute/.htpasswd")) {
|
||
touch("$absolute/.htpasswd");
|
||
return true;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*/
|
||
/**
|
||
* Retourne la liste de tous les dossiers de l'utilisateur contenant un .htpasswd
|
||
* @return array Tableau contenant la liste des dossiers protégés de l'utilisateur
|
||
*/
|
||
function ListDir() {
|
||
global $err,$mem;
|
||
$err->log("hta","listdir");
|
||
$sortie=array();
|
||
$absolute="/var/alternc/html/".substr($mem->user["login"],0,1)."/".$mem->user["login"];
|
||
exec("find $absolute -name .htpasswd | sort", $sortie);
|
||
if (!count($sortie)) {
|
||
$err->raise("hta",4);
|
||
return false;
|
||
}
|
||
for ($i=0;$i<count($sortie);$i++){
|
||
preg_match("/^\/var\/alternc\/html\/.\/[^\/]*\/(.*)\/\.htpasswd/", $sortie[$i], $matches);
|
||
$r[$i]=$matches[1]."/";
|
||
}
|
||
return $r;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*/
|
||
/**
|
||
* Retourne TRUE si le dossier paramètre est protégé.
|
||
* @param string $dir Dossier dont on souhaite vérifier la protection
|
||
* @return TRUE si le dossier est protégé, FALSE sinon
|
||
*/
|
||
function is_protected($dir){
|
||
global $mem,$err;
|
||
$err->log("hta","is_protected",$dir);
|
||
$absolute="/var/alternc/html/".substr($mem->user["login"],0,1)."/".$mem->user["login"]."/$dir";
|
||
$sortie=array();
|
||
if (file_exists("$absolute/.htpasswd")){
|
||
return true;
|
||
}
|
||
else {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*/
|
||
/**
|
||
* Retourne la liste des utilisateurs autorisés dans le dossier
|
||
* @param string $dir Dossier dont on souhaite obtenir la liste des user/pass
|
||
* @return array Tableau contenant la liste des logins du .htpasswd ou FALSE.
|
||
*/
|
||
function get_hta_detail($dir) {
|
||
global $mem,$err;
|
||
$err->log("hta","get_hta_detail");
|
||
$absolute="/var/alternc/html/".substr($mem->user["login"],0,1)."/".$mem->user["login"]."/$dir";
|
||
if (file_exists("$absolute/.htaccess")) {
|
||
/* if (!_reading_htaccess($absolute)) {
|
||
return false;
|
||
}
|
||
*/ }
|
||
$file = fopen("$absolute/.htpasswd","r");
|
||
$i=0;
|
||
$res=array();
|
||
fseek($file,0);
|
||
// TODO: Tester la validité du .htpasswd
|
||
while (!feof($file)) {
|
||
$s=fgets($file,1024);
|
||
$t=explode(":",$s);
|
||
if ($t[0]!=$s) {
|
||
$res[$i]=$t[0];
|
||
$i=$i+1;
|
||
}
|
||
}
|
||
fclose($file);
|
||
return $res;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*/
|
||
/**
|
||
* Déprotège un dossier
|
||
* @param string $dir Dossier à déprotéger
|
||
* @return boolean TRUE si le dossier a été déprotégé, FALSE sinon
|
||
*/
|
||
function DelDir($dir) {
|
||
global $mem,$bro,$err;
|
||
$err->log("hta","deldir",$dir);
|
||
$dir=$bro->convertabsolute($dir,0);
|
||
if (!$dir) {
|
||
$err->raise("hta",8,$dir);
|
||
return false;
|
||
}
|
||
if (!unlink("$dir/.htaccess")) {
|
||
$err->raise("hta",5,$dir);
|
||
return false;
|
||
}
|
||
if (!unlink("$dir/.htpasswd")) {
|
||
$err->raise("hta",6,$dir);
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*/
|
||
/**
|
||
* Ajoute un utilisateur à un dossier protégé.
|
||
* @param string $login Utilisateur à ajouter
|
||
* @param string $password Mot de passe à ajouter (en clair)
|
||
* @param string $dir Dossier concerné
|
||
* @return boolean TRUE si l'utilisateur a été ajouté avec succès, FALSE sinon
|
||
*/
|
||
function add_user($user,$password,$dir) {
|
||
global $err, $bro;
|
||
$err->log("hta","add_user",$user."/".$dir);
|
||
$absolute=$bro->convertabsolute($dir,0);
|
||
if (!file_exists($absolute)) {
|
||
$err->raise("hta",8,$dir);
|
||
return false;
|
||
}
|
||
if (checkloginmail($user)){
|
||
$file = fopen("$absolute/.htpasswd","a+");
|
||
fseek($file,0);
|
||
while (!feof($file)) {
|
||
$s=fgets($file,1024);
|
||
$t=explode(":",$s);
|
||
if ($t[0]==$user) {
|
||
$err->raise("hta",10,$user);
|
||
return false;
|
||
}
|
||
}
|
||
fseek($file,SEEK_END);
|
||
if (substr($t[1],-1)!="\n") {
|
||
fwrite($file,"\n");
|
||
}
|
||
fwrite($file, "$user:"._md5cr($password)."\n");
|
||
fclose($file);
|
||
return true;
|
||
} else {
|
||
$err->raise("hta",11);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*/
|
||
/**
|
||
* Supprime un ou plusieurs utilisateurs d'un dossier protégé.
|
||
* @param array $lst Tableau des logins à supprimer.
|
||
* @param string $dir Dossier dans lequel on souhaite supprimer des utilisateurs
|
||
* @return boolean TRUE si les utilisateurs ont été supprimés avec succès, FALSE sinon
|
||
*/
|
||
function del_user($lst,$dir) {
|
||
global $bro,$err;
|
||
$err->log("hta","del_user",$lst."/".$dir);
|
||
$absolute=$bro->convertabsolute($dir,0);
|
||
if (!file_exists($absolute)) {
|
||
$err->raise("hta",8,$dir);
|
||
return false;
|
||
}
|
||
touch("$absolute/.htpasswd.new");
|
||
$file = fopen("$absolute/.htpasswd","r");
|
||
$newf = fopen("$absolute/.htpasswd.new","a");
|
||
reset($lst);
|
||
fseek($file,0);
|
||
while (!feof($file)) {
|
||
$s=fgets($file,1024);
|
||
$t=explode(":",$s);
|
||
if (!in_array($t[0],$lst) && ($t[0]!="\n")) {
|
||
fseek($newf,0);
|
||
fwrite($newf, "$s");
|
||
}
|
||
}
|
||
fclose($file);
|
||
fclose($newf);
|
||
unlink("$absolute/.htpasswd");
|
||
rename("$absolute/.htpasswd.new", "$absolute/.htpasswd");
|
||
return true;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*/
|
||
/**
|
||
* Change le mot de passe d'un utilisateur d'un dossier protégé.
|
||
* @param string $user Utilisateur dont on souhaite changer le mot de passe
|
||
* @param string $newpass Nouveau mot de passe de cet utilisateur
|
||
* @param string $dir Dossier protégé concerné
|
||
* @return boolean TRUE si le mot de passe a été changé avec succès, FALSE sinon
|
||
*/
|
||
function change_pass($user,$newpass,$dir) {
|
||
global $bro,$err;
|
||
$err->log("hta","change_pass",$user."/".$dir);
|
||
$absolute=$bro->convertabsolute($dir,0);
|
||
if (!file_exists($absolute)) {
|
||
$err->raise("hta",8,$dir);
|
||
return false;
|
||
}
|
||
touch("$absolute/.htpasswd.new");
|
||
$file = fopen("$absolute/.htpasswd","r");
|
||
$newf = fopen("$absolute/.htpasswd.new","a");
|
||
while (!feof($file)) {
|
||
$s=fgets($file,1024);
|
||
$t=explode(":",$s);
|
||
if ($t[0]!=$user) {
|
||
fwrite($newf, "$s");
|
||
}
|
||
}
|
||
fwrite($newf, "$user:"._md5cr($newpass)."\n");
|
||
fclose($file);
|
||
fclose($newf);
|
||
unlink("$absolute/.htpasswd");
|
||
rename("$absolute/.htpasswd.new", "$absolute/.htpasswd");
|
||
return true;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------*/
|
||
/**
|
||
* Vérifie la validité des lignes d'un .htaccess existant.
|
||
* @param string $absolute Dossier que l'on souhaite vérifier
|
||
* @return boolean TRUE si le dossier est correctement protégé par un .htaccess, FALSE sinon
|
||
* @access private
|
||
*/
|
||
function _reading_htaccess($absolute) {
|
||
global $err;
|
||
$err->log("hta","_reading_htaccess",$absolute);
|
||
$file = fopen("$absolute/.htaccess","r+");
|
||
$lignes=array(1,1,1);
|
||
$errr=0;
|
||
while (!feof($file) && !$errr) {
|
||
$s=fgets($file,1024);
|
||
if (substr($s,0,14)!="ErrorDocument " && substr($s,0,12)!="RewriteRule " && substr($s,0,14)!="RewriteEngine " && trim($s)!="") {
|
||
$errr=1;
|
||
}
|
||
if (strtolower(trim($s))==strtolower("authuserfile $absolute/.htpasswd")) {
|
||
$lignes[0]=0;
|
||
$errr=0;
|
||
} // authuserfile
|
||
if (strtolower(trim($s))=="require valid-user") {
|
||
$lignes[1]=0;
|
||
$errr=0;
|
||
} //require
|
||
if (strtolower(trim($s))=="authtype basic") {
|
||
$lignes[2]=0;
|
||
$errr=0;
|
||
} //authtype
|
||
} // Reading config file
|
||
fclose($file);
|
||
if ($errr || in_array(0,$lignes)) {
|
||
$err->raise("hta",1);
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
} /* CLASS m_webaccess */
|
||
|
||
?>
|