[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3master/var/www/se3/partages/ -> create_share.php (source)

   1  <?php
   2  
   3  
   4     /**
   5     
   6     * Permet de creer un partage
   7     * @Version $Id: create_share.php 7575 2012-12-09 18:14:58Z keyser $ 
   8     
   9     * @Projet LCS / SambaEdu 
  10     
  11     * @auteurs  jLCF >:>  jean-luc.chretien@tice.ac-caen.fr
  12     * @auteurs Equipe TICE Crdp de Caen
  13     * @auteurs Olivier LECLUSE
  14  
  15     * @Licence Distribue selon les termes de la licence GPL
  16     
  17     * @note 
  18     
  19     */
  20  
  21     /**
  22  
  23     * @Repertoire: partages/
  24     * file: create_share.php
  25  
  26    */    
  27  
  28    
  29    include  "entete.inc.php";
  30    include  "ldap.inc.php";
  31    include  "ihm.inc.php";
  32  
  33  require_once  ("lang.inc.php");
  34  bindtextdomain('se3-partages',"/var/www/se3/locale");
  35  textdomain ('se3-partages');
  36  
  37  foreach ($_POST as $cle=>$val) {
  38      $$cle = $val;
  39          }
  40  
  41   // Fonctions internes a create_share.php
  42  
  43  /**
  44  * Verifie si l'entree est bien un groupe ou un uid
  45  * @Parametres $entry l'entree a tester
  46  * @return true ou false
  47  */
  48  
  49  
  50  function valid_uid_or_group($entry) {
  51        if ($entry !="") {
  52          // Splitage de $share_user_list
  53          $tmp = preg_split ("/\[ \]/",$entry,20);
  54          for ( $loop=0; $loop < count($tmp); $loop++) {
  55              // Recherche si c'est un utilisateur ou un groupe
  56              $return=strpos( $tmp[$loop], "@");
  57              if ( strpos( $tmp[$loop], "@") === 0) {
  58                  // Cette entree est un groupe
  59                  $name_group = substr ($tmp[$loop], 1);
  60                  // Recherche si le groupe existe
  61                  $group=search_groups ("(cn=".$name_group.")");
  62                  if ( count ($group) == 0 ) return false;
  63              } else {
  64                  // Cette entree est un uid
  65                  // Recherche si l'uid existe
  66                  $users = search_people ("(uid=".$tmp[$loop].")");
  67                  if ( count ($users) == 0 ) return false;
  68              }
  69          }
  70      }
  71      return true;
  72    }
  73  
  74  
  75  
  76  /**
  77  * Supprime les accents d'une chaine
  78  * @Parametres $chaine a nettoyer
  79  * @return la chaine sans accent
  80  */
  81  
  82  
  83  
  84   function cleanEntry ($chaine) {
  85    $chaine = stripslashes(strtr($chaine,
  86                    "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ ",
  87                    "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn_"));
  88    return $chaine;
  89  }
  90  
  91  
  92  /**
  93  * Normalise un path (supprime les accents et les espaces, met en minuscule ...
  94  * @Parametres $path a nettoyer
  95  * @return le chemin sans accent ...
  96  */
  97  
  98  
  99  function cleanPath ( $path ) {
 100      // Enleve les accents et «minusculise»
 101      $path = strtolower(cleanEntry($path));
 102      // Enleve les .,;:!&~#'{}()[]`^@°+-
 103      $path = strtr($path,"\.,;:!&~#'{}()[]`^@§°+-*","                        ");
 104      // Enleve les espaces
 105      $path = str_replace(" ", "", $path);
 106      // Enleve / en debut et en fin du chemin
 107      while (preg_match("/^\//",$path) ) $path = preg_replace ("/^\//", "", $path);
 108          while (preg_match("/\/$/",$path) ) $path = preg_replace ("/\/$/", "", $path);
 109      return $path;
 110  }
 111  
 112  
 113  
 114  
 115  
 116    if (is_admin("se3_is_admin",$login)=="Y") {
 117  
 118      //aide
 119      $_SESSION["pageaide"]="Ressources_et_partages";
 120  
 121  
 122      echo "<h1>".gettext("Cr&#233;ation de partage")."</h1>";
 123  
 124      // Definition des messages d'alerte
 125      $alerte_1="<div class='error_msg'>\n".gettext("Votre demande de cr&#233ation d'un nouveau partage n'a pas &#233t&#233 prise en compte car une t&#226;che d'administration est en cours sur le serveur")." <b>\n";
 126      $alerte_2="</b>,".gettext(" veuillez r&#233it&#233rer votre demande plus tard. Si le probl&#232;me persiste, veuillez contacter le super-utilisateur du serveur SE3.")."</div><BR>\n";
 127      $alerte_3="<div class='error_msg'>".gettext("Votre demande de cr&#233ation d'un nouveau partage a &#233chou&#233. Si le probl&#232;me persiste, veuillez contacter le super-utilisateur du serveur SE3.")."</div><BR>\n";
 128  
 129      // gettext a revoir: boireaus: J'ai ajoute un 's' a 'incoherente' et vire un 'e'
 130      $alerte_4="<div class='error_msg'>".gettext("Votre demande de cr&#233ation d'un nouveau partage a &#233chou&#233 car les informations collect&#233es sont incoh&#233rentes !!")."\n";
 131  
 132      // gettext a revoir: boireaus: J'ai ajoute modifie
 133      $share_name_alert = "<div class='error_msg'><li>".gettext("Le partage")." <strong>$share_name</strong> ".gettext("est d&#233ja pr&#233sent dans un des fichiers smb*.conf.")."\n";
 134  
 135      $share_user_list_alert = "<div class='error_msg'><li>".gettext("La liste des Utilisateur(s) ou groupe(s) autoris&#233s ou refus&#233s comporte une ou des entr&#233es invalides.")."\n";
 136      $share_admin_alert = "<div class='error_msg'><li>".gettext("La liste des utilisateur(s) ou groupe(s) ayant les droits d'administration sur ce partage  comporte une ou des enr&#233es invalides.")."\n";
 137      // Definition des messages d'info
 138      $info_1 = gettext("Cette t&#226;che est ordonnanc&#233e, vous recevrez un m&#232;l de confirmation de cr&#233ation dans quelques instants...");
 139  
 140      // A gettextiser: boireaus
 141      $Alert_ShareName_User_Ldap=gettext("<div class='error_msg'>Le nom de partage ne doit pas &#234tre le nom de login d'un utilisateur dans l'annuaire LDAP.</div>");
 142  
 143          #------------------------------------------
 144          // Prepositionnement variables
 145      $Verif_Empty = true;
 146  
 147          if ( mono_srv() ) {
 148          // configuration mono serveur  : determination des parametres du serveur
 149          $serveur=search_machines ("(l=maitre)", "computers");
 150          $cn_srv= $serveur[0]["cn"];
 151          $stat_srv = $serveur[0]["l"];
 152          $ipHostNumber =  $serveur[0]["ipHostNumber"];
 153          } else {
 154           // configuration multi-serveurs : presentation d'un form de selection du serveur
 155          if ( !$selected_srv && !$End_ph1) {
 156              echo "<H3>".gettext("S&#233lection du serveur ou vous souhaitez cr&#233er ce partage :")." </H3>\n";
 157              $servers=search_computers ("(|(l=esclave)(l=maitre))");
 158              echo "<form action=\"create_share.php\" method=\"post\">\n";
 159               for ($loop=0; $loop < count($servers); $loop++) {
 160                  echo $servers[$loop]["description"]." ".$servers[$loop]["cn"]."&nbsp;<input type=\"radio\" name=\"cn_srv\" value =\"".$servers[$loop]["cn"]."\"";
 161                  if ($loop==0) echo "checked";
 162                  echo "><BR>\n";
 163              }
 164                  $form="<input type=\"reset\" value=\"".gettext("R&#233initialiser la s&#233lection")."\">\n";
 165                  $form ="<input type=\"hidden\" name=\"selected_srv\" value=\"true\">\n";
 166                  $form.="<input type=\"submit\" value=\"".gettext("Valider")."\">\n";
 167                  $form.="</form>\n";
 168                  echo $form;
 169          } else {
 170                  // Determination des parametres du serveur cible dans le cas d'une conf multi-serveurs
 171                  $serveur=search_machines ("(cn=$cn_srv)", "computers");
 172                  $stat_srv = $serveur[0]["l"];
 173                  $ipHostNumber =  $serveur[0]["ipHostNumber"];
 174                }
 175       }
 176          // Fin selection et recherche des caracteristiques du serveur
 177  
 178      // Recherche si il y a des champs obligatoires vides
 179      if ( $End_ph1 && ( !$share_name || !$share_path ) )  $Verif_Empty = false;
 180  
 181      // Phase 1 : Saisie des donnees
 182      if ( ( !$End_ph1 &&  $stat_srv ) || ($End_ph1 && $Verif_Empty == false ) ) {
 183          echo "<H3>".gettext("Cr&#233ation d'un partage sur ")."$cn_srv : </h3>\n";
 184          echo "<H6>".gettext("[Phase1] Collecte des informations relatives au partage :")."</h6>\n";
 185          // Liste des parcs
 186          $list_parcs=search_machines("objectclass=groupOfNames","parcs");
 187          // Preparation du formulaire
 188          $form ="<form action='create_share.php' method='post'>\n";
 189          $form .="<table border='0'><tr>\n";
 190          // Nom du partage
 191          $form .="<td colspan='2'>".gettext("Nom du partage")."</td>\n";
 192          $form .="<td><input type='text' name='share_name' size='15'></td>\n";
 193          $form .="<td>&nbsp;*</td>\n";
 194          $form .="</tr><tr>\n";
 195          // Chemin du partage
 196          $form .="<td colspan='2'>".gettext("Chemin")." /var/se3/</td>\n";
 197          $form .="<td><input type='text' name='share_path' size='15'></td>\n";
 198          $form .="<td>&nbsp;*</td>\n";
 199          // Commentaire
 200          $form .="</tr><tr>\n";
 201          $form .="<td colspan='2'>".gettext("Commentaire")."</td>\n";
 202          $form .="<td><input type='text' name='share_comment' size='15'></td>\n";
 203          $form .="<td></td>\n";
 204          // Groupe propietiare du rep correspondant au partage
 205          $form .="</tr><tr>\n";
 206          $form .="<td colspan='2'>".gettext("Groupe propri&#233;taire du r&#233;pertoire")."</td>\n";
 207          $form .="<td><select name='dir_grp_owner'>
 208          <option value=\"$defaultgid\">".gettext("Tous")."</option>
 209          <option value=\"eleves\">".gettext("El&#232;ves")."</option>
 210          <option value=\"profs\">".gettext("Profs")."</option>
 211          <option value=\"admins\">".gettext("Admins")."</option>
 212          </select>
 213          <select name='dir_grp_perm'>
 214          <option value=\"rwx\">".gettext("Ecriture")."</option>
 215          <option value=\"rx\">".gettext("Lecture")."</option>
 216          </select>
 217          </td>\n";
 218          $form .="<td></td>\n";
 219          $form .="</tr><tr>\n";
 220          // Droits pour les autres
 221          $form .="</tr><tr>\n";
 222          $form .="<td colspan='2'>".gettext("Droits pour les autres")."</td>\n";
 223          $form .="<td><select name='dir_rights_other'>
 224          <option value=\"rx-\">".gettext("Lecture")."</option>
 225          <option value =\"---\">".gettext("Aucun")."</option>
 226          </select></td>\n";
 227          $form .="<td></td>\n";
 228          $form .="</tr><tr>\n";
 229          // Utilisateurs autorises ou refuses
 230          $form .="<td>Utilisateur(s)</td>\n";
 231          $form .="<td><select name='share_user_type'><option value=\"autorises\">".gettext("autoris&eacute;s")."</option><option value=\"refuses\">".gettext("refus&eacute;s")."</option></select></td>\n";
 232          $form .="<td><input type='text' name='share_user_list' size='15'></td>\n";
 233          $form .="<td></td>\n";
 234          $form .="</tr><tr>\n";
 235          $form .="<td colspan='2'>".gettext("Utilisateur(s) ayant les droits")."</td>\n";
 236          $form .="<td rowspan='2'><input type='text' name='share_admin' size='15'></td>\n";
 237          $form .="<td></td>\n";
 238          $form .="</tr><tr>\n";
 239          $form .="<td colspan='2'>".gettext("d'administration sur ce partage")."</td>\n";
 240          $form .="<td></td>\n";
 241          $form .="</tr><tr>\n";
 242          $form .="<td colspan='2'>".gettext("Limitation d'acc&#233s &#224 un parc")."</td>\n";
 243                  $form .= "<td>\n<SELECT NAME=\"parc_restrict\" SIZE=\"1\">";
 244          $form.= "<option value=\"\">\n";
 245                  for ($loop=0; $loop < count($list_parcs); $loop++) {
 246                      $form.= "<option value=".$list_parcs[$loop]["cn"].">".$list_parcs[$loop]["cn"]."\n";
 247                  }
 248                  $form .= "</SELECT>&nbsp;&nbsp;\n</td>";
 249          $form .="<td></td>\n";
 250          $form .="</tr><tr>\n";
 251          $form .="<td colspan='4'>";
 252          $form .= "<input type='hidden' value='true' name='End_ph1'>\n";
 253          $form .= "<input type='hidden' name='cn_srv' value='$cn_srv'>\n";
 254          $form .= "<input type='hidden' name='stat_srv' value='$stat_srv'>\n";
 255          $form .= "<input type='hidden' name='ipHostNumber' value='$ipHostNumber'>\n";
 256          $form .="</td></tr>\n";
 257          $form .="<td><input type='submit' value='".gettext("Soumettre")."' name='submit'></td>\n";
 258          $form .="<td>&nbsp;</td>\n";
 259          $form .="<td><input type='reset' value='".gettext("Recommencer")."' name='reset'></td>\n";
 260          $form .="<td>&nbsp;</td>\n";
 261          $form .="</tr></table>\n";
 262          $form .="</form>\n";
 263          echo $form;
 264  
 265          if ( $End_ph1 && $Verif_Empty == false )
 266              echo gettext ("<div class='error_msg'>".gettext("Les champs marqu&#233s d'une &#233toile doivent &#234tre compl&#233t&#233s !")."</div>")."\n";
 267  
 268      } elseif ( $End_ph1 ) {
 269  
 270          // Convertion des infos valid users ou invalid users
 271          if ( $share_user_type == "autorises" ) $share_user_type = "valid users"; else $share_user_type = "invalid users";
 272          // Phase 2  : Verification coherence des informations collectees
 273          $Verif_Result = true; $Verif_share_user_list = true; $Verif_share_admin = true;
 274          ## Cas du maitre ou de l'esclave
 275              ## Verifier validite des entrees du formulaire et nettoyage
 276              $share_name =  strtolower(cleanEntry($share_name));
 277              $share_comment =  cleanEntry($share_comment);
 278              $share_path =  cleanPath($share_path);
 279              $share_user_list =  strtolower(cleanEntry($share_user_list));
 280              $share_admin =  strtolower(cleanEntry($share_admin));
 281              /*
 282              echo "DEBUG >>     share_name $share_name<br>
 283                                             share_comment $share_comment<br>
 284                              share_path [$share_path]<br>
 285                              share_user_list  $share_user_list<br>
 286                              share_admin $share_admin<br>";
 287              */
 288              ## Verifier validite de la liste valid ou invalid users
 289              if (! valid_uid_or_group($share_user_list) ) {
 290                  $Verif_Result = false;
 291                  $Verif_share_user_list = false;
 292                  #echo "DEBUG >> Invalid user list<br>";
 293              }
 294              ## Verifier validite de la liste admin users
 295              if (! valid_uid_or_group($share_admin) ) {
 296                  $Verif_Result = false;
 297                  $Verif_share_admin = false;
 298                  #echo "DEBUG >> Invalid admin user list<br>";
 299              }
 300              ## Fine verification des entrees du formulaire et du nettoyage
 301          if ( $stat_srv == "maitre" ) {
 302              // Cas du maitre
 303              // Verifier la presence du partage dans smb.conf
 304              //exec ("/bin/grep \"<$share_name>\" /etc/samba/smb.conf", $AllOutPut, $ReturnValueShareName);
 305              // Le test n'etait pas bon: Il ne detectait que les partages ajoutes par l'utilisateur
 306              //                          pas ceux existant en standard dans SE3
 307              //                          Et il ne tient pas compte de la casse.
 308              //                          Et il ne teste pas les smb_*.conf
 309              exec ("/bin/grep -i \"\[$share_name\]\" /etc/samba/smb*.conf", $AllOutPut, $ReturnValueShareName);
 310              if ( $ReturnValueShareName == 0 ) $Verif_Result = false;
 311          } elseif ( $stat_srv == "esclave" ) {
 312              // Cas de l'esclave
 313              // Verifier la presence du partage dans smb.conf
 314                  //exec ("ssh -l remote_adm $ipHostNumber '/bin/grep \"$share_name\" /etc/samba/smb.conf'", $AllOutPut, $ReturnValueShareName);
 315                  // Correction du test: idem
 316                  exec ("ssh -l remote_adm $ipHostNumber '/bin/grep -i \"\[$share_name\]\" /etc/samba/smb*.conf'", $AllOutPut, $ReturnValueShareName);
 317              if ( $ReturnValueShareName == 0 ) $Verif_Result = false;
 318          }
 319  
 320          // Est-ce que le nom de partage correspond a un utilisateur dans l'annuaire:
 321          $ReturnValueShareName_User_Ldap=1;
 322          $tab_test_user=people_get_variables($share_name, false);
 323          /*
 324          echo "count($tab_test_user)=".count($tab_test_user)."<br />";
 325          foreach($tab_test_user as $cle => $valeur){
 326              echo "\$tab_test_user[$cle]=$valeur<br />";
 327          }
 328          echo "count($tab_test_user[0])=".count($tab_test_user[0])."<br />";
 329          foreach($tab_test_user[0] as $cle => $valeur){
 330              echo "\$tab_test_user[0][$cle]=$valeur<br />";
 331          }
 332          */
 333          if(count($tab_test_user[0])!=0){
 334              $ReturnValueShareName_User_Ldap=0;
 335              $Verif_Result = false;
 336          }
 337  
 338              #### $Verif_Result = false; // Forcee a false pour DEBUG !
 339          // Phase 2' : Affichage des caracteristique du nouveau partage
 340          echo "<H3>".gettext("Cr&#233ation d'un partage sur")." $cn_srv : </h3>\n";
 341          echo "<H6>".gettext("[Phase 2] Controle de coh&#233rence :")."</h6>\n";
 342          if ( !$Verif_Result ) {
 343              echo $alerte_4;
 344              if ( $ReturnValueShareName == 0 ) echo $share_name_alert;
 345              if ( $Verif_share_user_list == false ) echo $share_user_list_alert;
 346              if ( $Verif_share_admin == false ) echo $share_admin_alert;
 347  
 348              if($ReturnValueShareName_User_Ldap==0){
 349                  // Le nom de partage correspond a un utilisateur dans l'annuaire:
 350                  echo $Alert_ShareName_User_Ldap;
 351              }
 352  
 353              echo "</div><br>\n";
 354          } else {
 355              // Si creation sur serveur maitre
 356              if ( $stat_srv == "maitre" )
 357              {
 358                  system("sudo /usr/share/se3/scripts/create_share.sh \
 359                  \"$share_name\" \"$share_comment\" \"$share_path\"\
 360                  \"$REMOTE_ADDR\" \"$share_user_type\" \"$dir_rights_other\"\
 361                  \"$dir_grp_owner\" \"$dir_grp_perm\" admin=\"$share_admin\"\
 362                  parc=\"$parc_restrict\" user_list=\"$share_user_list\"");
 363  
 364              // Si creation sur un esclave
 365              } elseif ( $stat_srv == "esclave" ) {
 366                  system("ssh -l remote_adm $ipHostNumber sudo /usr/share/se3/scripts/create_share.sh\
 367                                        \"$share_name\" \"$share_comment\" \"$share_path\"\
 368                                        \"$REMOTE_ADDR\" \"$share_user_type\" \"$dir_rights_other\"\
 369                                        \"$dir_grp_owner\" \"$dir_grp_perm\" admin=\"$share_admin\"\
 370                                        parc=\"$parc_restrict\" user_list=\"$share_user_list\"");
 371              } // Fin elseif ( $stat_srv == "esclave" )
 372          } // Fin if ( !$Verif_Result )
 373      // Fin elseif End_ph1
 374      }
 375  
 376  } // Fin if is_admin
 377    include ("pdp.inc.php");
 378  ?>


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1