:> jean-luc.chretien@tice.ac-caen.fr
* @auteurs Equipe TICE Crdp de Caen
* @auteurs Olivier LECLUSE
* @Licence Distribue selon les termes de la licence GPL
* @note
*/
/**
* @Repertoire: partages/
* file: create_share.php
*/
include "entete.inc.php";
include "ldap.inc.php";
include "ihm.inc.php";
require_once ("lang.inc.php");
bindtextdomain('se3-partages',"/var/www/se3/locale");
textdomain ('se3-partages');
foreach ($_POST as $cle=>$val) {
$$cle = $val;
}
// Fonctions internes a create_share.php
/**
* Verifie si l'entree est bien un groupe ou un uid
* @Parametres $entry l'entree a tester
* @return true ou false
*/
function valid_uid_or_group($entry) {
if ($entry !="") {
// Splitage de $share_user_list
$tmp = preg_split ("/\[ \]/",$entry,20);
for ( $loop=0; $loop < count($tmp); $loop++) {
// Recherche si c'est un utilisateur ou un groupe
$return=strpos( $tmp[$loop], "@");
if ( strpos( $tmp[$loop], "@") === 0) {
// Cette entree est un groupe
$name_group = substr ($tmp[$loop], 1);
// Recherche si le groupe existe
$group=search_groups ("(cn=".$name_group.")");
if ( count ($group) == 0 ) return false;
} else {
// Cette entree est un uid
// Recherche si l'uid existe
$users = search_people ("(uid=".$tmp[$loop].")");
if ( count ($users) == 0 ) return false;
}
}
}
return true;
}
/**
* Supprime les accents d'une chaine
* @Parametres $chaine a nettoyer
* @return la chaine sans accent
*/
function cleanEntry ($chaine) {
$chaine = stripslashes(strtr($chaine,
"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ ",
"aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn_"));
return $chaine;
}
/**
* Normalise un path (supprime les accents et les espaces, met en minuscule ...
* @Parametres $path a nettoyer
* @return le chemin sans accent ...
*/
function cleanPath ( $path ) {
// Enleve les accents et «minusculise»
$path = strtolower(cleanEntry($path));
// Enleve les .,;:!&~#'{}()[]`^@°+-
$path = strtr($path,"\.,;:!&~#'{}()[]`^@§°+-*"," ");
// Enleve les espaces
$path = str_replace(" ", "", $path);
// Enleve / en debut et en fin du chemin
while (preg_match("/^\//",$path) ) $path = preg_replace ("/^\//", "", $path);
while (preg_match("/\/$/",$path) ) $path = preg_replace ("/\/$/", "", $path);
return $path;
}
if (is_admin("se3_is_admin",$login)=="Y") {
//aide
$_SESSION["pageaide"]="Ressources_et_partages";
echo "
".gettext("Création de partage")."
";
// Definition des messages d'alerte
$alerte_1="\n".gettext("Votre demande de création d'un nouveau partage n'a pas été prise en compte car une tâche d'administration est en cours sur le serveur")." \n";
$alerte_2=",".gettext(" veuillez réitérer votre demande plus tard. Si le problème persiste, veuillez contacter le super-utilisateur du serveur SE3.")."
\n";
$alerte_3="".gettext("Votre demande de création d'un nouveau partage a échoué. Si le problème persiste, veuillez contacter le super-utilisateur du serveur SE3.")."
\n";
// gettext a revoir: boireaus: J'ai ajoute un 's' a 'incoherente' et vire un 'e'
$alerte_4="".gettext("Votre demande de création d'un nouveau partage a échoué car les informations collectées sont incohérentes !!")."\n";
// gettext a revoir: boireaus: J'ai ajoute modifie
$share_name_alert = "
".gettext("Le partage")." $share_name ".gettext("est déja présent dans un des fichiers smb*.conf.")."\n";
$share_user_list_alert = "".gettext("La liste des Utilisateur(s) ou groupe(s) autorisés ou refusés comporte une ou des entrées invalides.")."\n";
$share_admin_alert = "".gettext("La liste des utilisateur(s) ou groupe(s) ayant les droits d'administration sur ce partage comporte une ou des enrées invalides.")."\n";
// Definition des messages d'info
$info_1 = gettext("Cette tâche est ordonnancée, vous recevrez un mèl de confirmation de création dans quelques instants...");
// A gettextiser: boireaus
$Alert_ShareName_User_Ldap=gettext("Le nom de partage ne doit pas être le nom de login d'un utilisateur dans l'annuaire LDAP.
");
#------------------------------------------
// Prepositionnement variables
$Verif_Empty = true;
if ( mono_srv() ) {
// configuration mono serveur : determination des parametres du serveur
$serveur=search_machines ("(l=maitre)", "computers");
$cn_srv= $serveur[0]["cn"];
$stat_srv = $serveur[0]["l"];
$ipHostNumber = $serveur[0]["ipHostNumber"];
} else {
// configuration multi-serveurs : presentation d'un form de selection du serveur
if ( !$selected_srv && !$End_ph1) {
echo "".gettext("Sélection du serveur ou vous souhaitez créer ce partage :")."
\n";
$servers=search_computers ("(|(l=esclave)(l=maitre))");
echo "\n";
echo $form;
} else {
// Determination des parametres du serveur cible dans le cas d'une conf multi-serveurs
$serveur=search_machines ("(cn=$cn_srv)", "computers");
$stat_srv = $serveur[0]["l"];
$ipHostNumber = $serveur[0]["ipHostNumber"];
}
}
// Fin selection et recherche des caracteristiques du serveur
// Recherche si il y a des champs obligatoires vides
if ( $End_ph1 && ( !$share_name || !$share_path ) ) $Verif_Empty = false;
// Phase 1 : Saisie des donnees
if ( ( !$End_ph1 && $stat_srv ) || ($End_ph1 && $Verif_Empty == false ) ) {
echo "".gettext("Création d'un partage sur ")."$cn_srv :
\n";
echo "".gettext("[Phase1] Collecte des informations relatives au partage :")."
\n";
// Liste des parcs
$list_parcs=search_machines("objectclass=groupOfNames","parcs");
// Preparation du formulaire
$form ="\n";
echo $form;
if ( $End_ph1 && $Verif_Empty == false )
echo gettext ("".gettext("Les champs marqués d'une étoile doivent être complétés !")."
")."\n";
} elseif ( $End_ph1 ) {
// Convertion des infos valid users ou invalid users
if ( $share_user_type == "autorises" ) $share_user_type = "valid users"; else $share_user_type = "invalid users";
// Phase 2 : Verification coherence des informations collectees
$Verif_Result = true; $Verif_share_user_list = true; $Verif_share_admin = true;
## Cas du maitre ou de l'esclave
## Verifier validite des entrees du formulaire et nettoyage
$share_name = strtolower(cleanEntry($share_name));
$share_comment = cleanEntry($share_comment);
$share_path = cleanPath($share_path);
$share_user_list = strtolower(cleanEntry($share_user_list));
$share_admin = strtolower(cleanEntry($share_admin));
/*
echo "DEBUG >> share_name $share_name
share_comment $share_comment
share_path [$share_path]
share_user_list $share_user_list
share_admin $share_admin
";
*/
## Verifier validite de la liste valid ou invalid users
if (! valid_uid_or_group($share_user_list) ) {
$Verif_Result = false;
$Verif_share_user_list = false;
#echo "DEBUG >> Invalid user list
";
}
## Verifier validite de la liste admin users
if (! valid_uid_or_group($share_admin) ) {
$Verif_Result = false;
$Verif_share_admin = false;
#echo "DEBUG >> Invalid admin user list
";
}
## Fine verification des entrees du formulaire et du nettoyage
if ( $stat_srv == "maitre" ) {
// Cas du maitre
// Verifier la presence du partage dans smb.conf
//exec ("/bin/grep \"<$share_name>\" /etc/samba/smb.conf", $AllOutPut, $ReturnValueShareName);
// Le test n'etait pas bon: Il ne detectait que les partages ajoutes par l'utilisateur
// pas ceux existant en standard dans SE3
// Et il ne tient pas compte de la casse.
// Et il ne teste pas les smb_*.conf
exec ("/bin/grep -i \"\[$share_name\]\" /etc/samba/smb*.conf", $AllOutPut, $ReturnValueShareName);
if ( $ReturnValueShareName == 0 ) $Verif_Result = false;
} elseif ( $stat_srv == "esclave" ) {
// Cas de l'esclave
// Verifier la presence du partage dans smb.conf
//exec ("ssh -l remote_adm $ipHostNumber '/bin/grep \"$share_name\" /etc/samba/smb.conf'", $AllOutPut, $ReturnValueShareName);
// Correction du test: idem
exec ("ssh -l remote_adm $ipHostNumber '/bin/grep -i \"\[$share_name\]\" /etc/samba/smb*.conf'", $AllOutPut, $ReturnValueShareName);
if ( $ReturnValueShareName == 0 ) $Verif_Result = false;
}
// Est-ce que le nom de partage correspond a un utilisateur dans l'annuaire:
$ReturnValueShareName_User_Ldap=1;
$tab_test_user=people_get_variables($share_name, false);
/*
echo "count($tab_test_user)=".count($tab_test_user)."
";
foreach($tab_test_user as $cle => $valeur){
echo "\$tab_test_user[$cle]=$valeur
";
}
echo "count($tab_test_user[0])=".count($tab_test_user[0])."
";
foreach($tab_test_user[0] as $cle => $valeur){
echo "\$tab_test_user[0][$cle]=$valeur
";
}
*/
if(count($tab_test_user[0])!=0){
$ReturnValueShareName_User_Ldap=0;
$Verif_Result = false;
}
#### $Verif_Result = false; // Forcee a false pour DEBUG !
// Phase 2' : Affichage des caracteristique du nouveau partage
echo "".gettext("Création d'un partage sur")." $cn_srv :
\n";
echo "".gettext("[Phase 2] Controle de cohérence :")."
\n";
if ( !$Verif_Result ) {
echo $alerte_4;
if ( $ReturnValueShareName == 0 ) echo $share_name_alert;
if ( $Verif_share_user_list == false ) echo $share_user_list_alert;
if ( $Verif_share_admin == false ) echo $share_admin_alert;
if($ReturnValueShareName_User_Ldap==0){
// Le nom de partage correspond a un utilisateur dans l'annuaire:
echo $Alert_ShareName_User_Ldap;
}
echo "
\n";
} else {
// Si creation sur serveur maitre
if ( $stat_srv == "maitre" )
{
system("sudo /usr/share/se3/scripts/create_share.sh \
\"$share_name\" \"$share_comment\" \"$share_path\"\
\"$REMOTE_ADDR\" \"$share_user_type\" \"$dir_rights_other\"\
\"$dir_grp_owner\" \"$dir_grp_perm\" admin=\"$share_admin\"\
parc=\"$parc_restrict\" user_list=\"$share_user_list\"");
// Si creation sur un esclave
} elseif ( $stat_srv == "esclave" ) {
system("ssh -l remote_adm $ipHostNumber sudo /usr/share/se3/scripts/create_share.sh\
\"$share_name\" \"$share_comment\" \"$share_path\"\
\"$REMOTE_ADDR\" \"$share_user_type\" \"$dir_rights_other\"\
\"$dir_grp_owner\" \"$dir_grp_perm\" admin=\"$share_admin\"\
parc=\"$parc_restrict\" user_list=\"$share_user_list\"");
} // Fin elseif ( $stat_srv == "esclave" )
} // Fin if ( !$Verif_Result )
// Fin elseif End_ph1
}
} // Fin if is_admin
include ("pdp.inc.php");
?>