[RESOLU] Appliquer un CHMOD

Eléphant du PHP | 161 Messages

27 janv. 2016, 11:16

Bonjour à tous et à toutes,

J'avais commencé un projet au top de sa forme, mais stagiaire, mon tuteur m'a finalement dit de l'arrêter et de recommencer pour obtenir quelque chose de fonctionnel plus rapidement avec un code plus allégé... Le projet était de construire un plugin Wordpress, qui s'insère dans un widget, dans le tableau de bord, et qui consiste à protéger les dossiers et fichiers contenu dans le dossier du site par des click sur les boutons, car pour ceux qui ne le savent pas, Wordpress est un CMS open source, et les failles de sécurité ne sont pas moindres.

Après être passé d'une interface dynamique, dont le code venait entièrement de moi en plus, donc je savais où j'allais, à une interface, qui plus simple est par rapport à la première, dans laquelle je me perds un peu, je me retrouve donc confronté à un problème : le CHMOD !

J'aimerais, après avoir sélectionner des checkboxs, et après avoir appuyer sur un bouton (qui comprend une valeur), appliquer un CHMOD, qui comprend la valeur du bouton sélectionné (soit 0777 par exemple), et cette dernière serait affectée aux dossiers sélectionnés.

Voici mon code :

index.php

Code : Tout sélectionner

<style> <?php include 'css/dashboardFormulaire.css'; ?> </style> <script> function chercher_elements(n) { var liste = document.getElementsByTagName('input'), nbre = liste.length, cherche=n+'-', lg=cherche.length, trouve = [], index, element, zz; for (index = 0; index < nbre; index ++) { element = liste[index].id; if (n!='tout') { if (element.substring(0,lg)==cherche) trouve.push(element); } else { if (element.substring(0,1)>='0' && element.substring(0,1)<='9') trouve.push(element); } } return trouve; } function selectionner(z,chk){ var dossiers = chercher_elements(z); var nbre = dossiers.length; for (var i = 0; i < nbre; i++) { document.getElementById(dossiers[i]).checked=chk; } } </script> <?php function scanRecursiveDir($path = '../', $level , $levelprec) { if(substr_count($levelprec, '-') != 0) return; $numdossier = 1; // Répertoires à ignorer $ignore = array('.', '..','public_html'); // Répertoire à ouvrir $dh = @opendir($path); // Boucler dans le répertoire : while(false !== ($file = readdir($dh))) { //Si ce fichier ne doit pas être ignoré alors... if(!in_array( $file, $ignore)) { // On effectue un espace pour une meilleure vue... $spaces = str_repeat('&nbsp;', ($level * 5)); // Et on ne montre que les sous-répertoires ! if(is_dir("$path/$file")) { //On place dans une variable les droits de chaque répertoires que l'on appelera à chaque fois $perms = substr(sprintf('%o', fileperms($path)), -3); // On appelle à nouveau cette fonction dans les nouveaux répertoires de façon à ce que ce soit récursif. $idcourant = "$levelprec".(strlen($levelprec)?'-' : '')."$numdossier"; echo" <li id=\"lucie_arborescence\">" .$spaces."\r\n". "<input type=\"checkbox\" name=\"checkboxDossierPath[]\" id=\"$idcourant\" onclick = \"selectionner('$idcourant',this.checked);\" value=\"$path\"/> \r\n"."<a href=$path/$file> $file</a> <div class=\"securitywp_droit\">($perms)</div></li>"; scanRecursiveDir("$path/$file", ($level+1),"$levelprec".(strlen($levelprec)?'-' : '')."$numdossier"); $numdossier++; } } } //On n'oublie pas de fermer le répertoire racine closedir($dh); } ?> <div id="securitywp_explorateur"> <header id="securitywp_header"> <input type="checkbox" name="toutCocher" id="checkall" onclick = "selectionner('tout',this.checked);" /> Tout sélectionner </header> <div id="securitywp_container_id"> <div id="securitywp_result_ajax"></div> <?php echo '<form id="securitywp_form" name="form" action="../wp-content/plugins/SecurityWP/traitement.php" methode="POST"><ul>'; scanRecursiveDir('../', 0, ''); ?> <div id="securitywp_chmodButtons"> Choisir une sécurité : <br/> <input type="button" name="button01" id="button001" class="class_buttons" value="0600" onclick="this.form.choice.value=this.value;"/> <input type="button" name="button02" id="button002" class="class_buttons" value="0755" onclick="this.form.choice.value=this.value;"/> <input type="button" name="button03" id="button003" class="class_buttons" value="0705" onclick="this.form.choice.value=this.value;"/> </div> <div id="securitywp_footer"> Retirer la sécurité : <br/> <input type="button" name="button04" id="securitywp_noSecurity" class="class_buttons" value="0777" name="securitywp_noSecurity" onclick="this.form.choice.value=this.value;"/> <input type="hidden" name="choice" id="choice"/> </div> <?php echo '</ul></form>'; ?> </div> </div> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> $(document).ready(function() { $("#securitywp_form").submit(function(e) { var postData = $(this).serializeArray(); var formURL = $(this).attr("action"); $.ajax( { url : formURL, type: "POST", data : postData, success:function(data, textStatus, jqXHR) { function include(file) { var oScript = document.createElement("script"); oScript.src = file; document.body.appendChild(oScript); $("#securitywp_result_ajax").html(data); $("#securitywp_result_ajax").css({"display":"block"}); } include("../wp-content/plugins/SecurityWP/traitement.php"); }, error: function(jqXHR, textStatus, errorThrown) { $("#securitywp_result_ajax").html("Attention"); } }); e.preventDefault(); //STOP default action }); $("#securitywp_noSecurity").click(function() { $("#securitywp_form").submit(); }); $("#button001").click(function() { $("#securitywp_form").submit(); }); $("#button002").click(function() { $("#securitywp_form").submit(); }); $("#button003").click(function() { $("#securitywp_form").submit(); }); }); </script>
traitement.php :

Code : Tout sélectionner

<?php if(isset($_POST['checkboxDossierPath'])) { $valeurNumerique = $_POST['choice']; echo $valeurNumerique; foreach($_POST['checkboxDossierPath'] as $valeur) { echo "La checkbox $valeur a été cochée<br>"; chmod($valeur, $valeurNumerique); //C'est cette ligne qui pose soucis } } else { echo 'Veuillez tout d\'abord sélectionner les dossiers auxquels modifier les attributs.'; } ?>
Et voici l'erreur :

No such file or directory in C:\wamp\www\wordpress2\wp-content\plugins\SecurityWP\traitement.php on line 9;



Toutefois, je tiens à signaler que j'ai une petite appréhension au niveau du code. Je pense que $variable contient le chemin des fichiers, dossiers et non pas le nom de ces derniers.
Alors comment faire, s'il vous plaît ?

ViPHP
ViPHP | 928 Messages

27 janv. 2016, 12:12

Salut,
l'erreur parle d'elle même, le chemin que tu passes à chmod() n'existe pas, donc vérifie qu'il soit bon. Si tu utilises un chemin relatif, vérifies le dossier dans lequel ton script est exécuté en faisant "echo getcwd();".

Eléphant du PHP | 161 Messages

27 janv. 2016, 12:16

Euuuuuh ouais.

Eléphant du PHP | 161 Messages

27 janv. 2016, 12:23

Je le fais où ? Et du coup j'en fais quoi ?
ça ne m'aide pas vraiment en fait, puisque j'ai supposé m'être trompé et savoir où était mon erreur, mais je ne sais pas comment la corriger.
Donc je repose la question : à votre avis, comment puis-je récupérer le chemin correctement et le ré-envoyer dans traitement.php ?

Mammouth du PHP | 1967 Messages

27 janv. 2016, 12:37

echo"
            <li id=\"lucie_arborescence\">"
            .$spaces."\r\n".
            "<input type=\"checkbox\" name=\"checkboxDossierPath[]\" id=\"$idcourant\" onclick = \"selectionner('$idcourant',this.checked);\" value=\"$path\"/>
            \r\n"."<a href=$path/$file> $file</a>
            <div class=\"securitywp_droit\">($perms)</div></li>";
C'est normal que value soit seulement $path et non $path/$file ??

Classiquement avec ce type d'erreur, on affiche le contenu des variables pour débugger. un echo $valeur juste avant ton chmod pourra te dire si le chemin renseigné à ta fonction est correct ou non. Si il n'est pas correct, il faut remonter à l'origine de l'erreur.

C'est typiquement un processus à faire à chaque erreur
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 161 Messages

27 janv. 2016, 12:46

Déjà c'est vrai que c'est beaucoup mieux comme ça.

Eléphant du PHP | 161 Messages

27 janv. 2016, 12:51

Mais après mon problème n'est toujours pas résolu.

Mammouth du PHP | 1967 Messages

27 janv. 2016, 12:56

Classiquement avec ce type d'erreur, on affiche le contenu des variables pour débugger. un echo $valeur juste avant ton chmod pourra te dire si le chemin renseigné à ta fonction est correct ou non. Si il n'est pas correct, il faut remonter à l'origine de l'erreur.
Que te donne cet echo ??

Il faut nous aider à t'aider, nous ne sommes pas devant ton PC
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 161 Messages

27 janv. 2016, 13:03

Cet echo me donne la valeur correcte. C'est à dire que que si j'ai coché wp-admin, et bien echo $valeur me renverra : ..//wp-admin, ainsi que ../wp-admin/css etc ...
Comment peut-on envoyer des images pour que cela vous soit plus parlant s'il vous plaît ?

Eléphant du PHP | 161 Messages

27 janv. 2016, 13:04

À la limite il y'a aurait donc une première erreur par rapport à ..//wp-admin ?

Mammouth du PHP | 1967 Messages

27 janv. 2016, 14:14

Le double slash n'est pas normal,

Et comme disait Genova, c'est un chemin relatif, il faut vérifier depuis où part ce chemin et adapter en conséquence.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 161 Messages

27 janv. 2016, 14:18

Bah oui mais bon c'est bien gentil de me dire d'adapter en conséquence mais moi je ne vois pas comment du tout hein.. C'est bien pour ça que j'expose mon problème.

Mammouth du PHP | 1967 Messages

27 janv. 2016, 14:48

Renseigne toi sur la différence entre chemin relatif et absolu,

Tes fichiers index.php et traitement.php ne sont pas dans le même dossier, donc un chemin relatif créé sur index.php (pour créer tes checkbox) ne sera pas utilisable sur traitement.php sans adaptation du chemin.

Donc tu as 2 solutions, soit tu travail en chemin absolu, soit tu travail en chemin relatif et tu l'adapte par rapport à où se trouve le fichier de traitement.

Nous sommes là pour t'aider à trouver les réponses, pas pour les donner.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 161 Messages

27 janv. 2016, 15:01

C'est déjà fait, mais ça ne m'aide pas plus.

Mes fichiers index.php et traitement.php sont tout à fait dans le même dossier, si.
Je n'ai juste pas le choix d'écrire mes chemins autrement en localhost, sinon mes données ne sont pas envoyées vers traitement.php

J'ai justement mentionné plus haut le fait que ça ne m'éclairait pas, je ne pense pas avoir mentionné autre chose.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

27 janv. 2016, 15:49

Modération :

PHPfrance est un forum d'entraide où nous sommes tous bénévoles et où nous prenons du temps pour aider et accompagner ceux qui ont des difficultés, comme c'est ton cas.
La moindre des choses quand on demande un coup de main, c'est de respecter ses interlocuteurs.

Les messages suivants n'ont rien à faire sur PHPfrance, surtout quand il sont postés à quelques minutes d'intervalles :
Euuuuuh ouais.
Je le fais où ? Et du coup j'en fais quoi ?
ça ne m'aide pas vraiment en fait, [...]
Mais après mon problème n'est toujours pas résolu.
Bah oui mais bon c'est bien gentil de me dire d'adapter en conséquence mais moi je ne vois pas comment du tout hein.. C'est bien pour ça que j'expose mon problème.
C'est déjà fait, mais ça ne m'aide pas plus. [...]
J'ai justement mentionné plus haut le fait que ça ne m'éclairait pas, je ne pense pas avoir mentionné autre chose.
C'est à toi de faire des efforts pour comprendre tes messages d'erreur, débugger ton propre code, faire des recherche sur internet pour essayer de les résoudre par toi même, et si malgré cela tu dois poser une question sur le forum, c'est à toi de faire l'effort de comprendre les réponses qui te sont apportées par tes interlocuteurs.
Quand tout le reste a échoué, lisez le mode d'emploi...