:> 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"; for ($loop=0; $loop < count($servers); $loop++) { echo $servers[$loop]["description"]." ".$servers[$loop]["cn"]." 
    \n"; } $form="\n"; $form ="\n"; $form.="\n"; $form.="
    \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"; $form .="\n"; // Nom du partage $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; // Chemin du partage $form .="\n"; $form .="\n"; $form .="\n"; // Commentaire $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; // Groupe propietiare du rep correspondant au partage $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; // Droits pour les autres $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; // Utilisateurs autorises ou refuses $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .= ""; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="\n"; $form .="
    ".gettext("Nom du partage")." *
    ".gettext("Chemin")." /var/se3/ *
    ".gettext("Commentaire")."
    ".gettext("Groupe propriétaire du répertoire")."
    ".gettext("Droits pour les autres")."
    Utilisateur(s)
    ".gettext("Utilisateur(s) ayant les droits")."
    ".gettext("d'administration sur ce partage")."
    ".gettext("Limitation d'accés à un parc")."\n  \n
    "; $form .= "\n"; $form .= "\n"; $form .= "\n"; $form .= "\n"; $form .="
      
    \n"; $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"); ?>