Modifier droit dossier FTP -> modifier droits de tout ce qu'il y a à l'intérieur

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, j'ai besoin d'aide SVP.

Je suis en train de mettre en place un script pour que les utilisateurs puissent modifier via un admin les droits d'accès de leurs fichiers et dossiers de leur FTP.

Si l'utilisateur modifie les droits d'accès de juste un fichier, ça fonctionne. Si l'utilisateur modifie les droits d'accès de juste un dossier, ça fonctionne aussi.

Ce que je souhaite aussi (et que je n'arrive pas à mettre en place), c'est que si un utilisateur modifie les droits d'accès d'un dossier, qu'il puisse aussi avoir la possibilité (via une checkbox par exemple…) de modifier aussi les droits d'accès de tout ce qu'il y a à l’intérieur (fichiers, dossiers…) .

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php
$np = '0'.$droits;
$filesPath = $this->user->dir_current.'/'.$nameFileOrFolder;

//  si checkbox cochée - si on modifie droits d'un dossier et qu'on veut aussi que ça modifie droits de tout ce qu'il y a à l'intérieur
if ($isFolder && $editPermissionsOfFilesInFolder) {

    // - c est ici que je je ne sais pas trop quoi faire

}
// si on modifie droit d'un fichier, ou juste d'un dossier
else {
   // - marche
    return (ftp_chmod($conn_id, eval("return({$np});"), $filesPath) !== false);
}

Quelqu’un aurai une idée SVP ? Merci beaucoup.

Édité par stephweb

+0 -0
Auteur du sujet

Merci, oui il y a un moyen avec ftp_nlist, mais je n'arrive pas à finir ma function récursive. et j'ai l impression qu'il n'existe pas de fonction is_dir pour le FTP.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
// si checkbox cochée - si on modifie droits d'un dossier et qu'on veut aussi modifier droits de ce qu'il y a à l'intérieur...
if ($isFolder && $editPermissionsOfFilesInFolder) {
   // _c'est ici que je galère


    // ...on récup le dossier + les fichiers qui sont à l'interieur...
    function save($conn_id, $filesPath) {
        static $inFolder = array();

        $buff = ftp_nlist($conn_id, $filesPath);
        foreach ($buff as $oneBuff) {
            if ($oneBuff != '..'){
                $inFolder[] = $filesPath.'/'.$oneBuff;

                si $filesPath.'/'.$oneBuff est un dossier {
                    $inFolder[] = save($conn_id, $filesPath.'/'.$oneBuff);
                }

            }
        }
        return $inFolder;
    }

    $inFolder = save($conn_id, $filesPath);
    //var_dump($inFolder);

    // ...on modifie dossiers et fichiers qui sont à l'interieur
    foreach ($inFolder as $oneInFolder) {
        ftp_chmod($conn_id, eval("return({$np});"), $oneInFolder);
    }



}
// si on modifie droit d'un fichier, ou juste d'un dossier
else {
   // _ça marche
    return (ftp_chmod($conn_id, eval("return({$np});"), $filesPath) !== false);
}

Merci d'avance

Édité par stephweb

+0 -0
Auteur du sujet

Le "si $filesPath.'/'.$oneBuff est un dossier", je l'ai mis ici pour justement vous aider à comprendre la où je bloque (mais je ne le met pas dans mon vrai code.). La où je bloque, c'est que je n'arrive pas à récupérer tout les sous-dossiers. Merci beaucoup

+0 -0
Auteur du sujet

merci. mais si dans ma boucle je fait:

1
2
3
4
<?php
var_dump(ftp_size($ftp_connect, $filesPath.'/'.$oneBuff) == -1);

var_dump($filesPath.'/'.$oneBuff);

ça me renvoi false, y compris pour mon dossier.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
string(3) "www"
bool(false)
string(6) "/www/."
bool(false)
string(14) "/www/index.htm"
bool(false)
string(15) "/www/robots.txt"
bool(false)
string(10) "/www/stats"
bool(false)
string(13) "/www/toto.ini"

Et "/www/stats" est bien un dossier situé dans "/www/.". Et "/www/stats" contient lui-meme 2 fichiers.

Édité par stephweb

+0 -0
Auteur du sujet

ok merci.

Le dossier que je test est "www". à la ligne 25 avec la function "save" je récupère tout les fichiers et dossiers que "www" contient. Et si c'est un dossier qui dans "www" je veut récupérer aussi tout les éventuels dossiers et fichiers que ce dossier contient et ainsi de suite… Donc je pense que dans ma boucle foreach je doit tester que si $filesPath.'/'.$oneBuff est un dossier, refaire appel récursivement à ma function "save".

Ce que mon "www" contient :

1
2
3
4
5
6
string(6) "/www/."
string(6) "/www/.."
string(14) "/www/index.htm"
string(15) "/www/robots.txt"
string(10) "/www/stats"
string(13) "/www/toto.ini"

Et "/www/stats" est un dossier qui contient lui meme 2 fichiers, donc j'aimerai les récupérer et les ajouter à ma variable static inFolder que je return. Merci.

Édité par stephweb

+0 -0
Auteur du sujet

ok merci. faut donc que je trouve comment faire un équivalent de is_dit pour FTP. Car si dans ma boucle foreach je fait:

1
2
<?php
var_dump(ftp_size($ftp_connect, $filesPath.'/'.$oneBuff));

ça me renvoi NULL pour tout les fichiers et aussi pour le dossier

+0 -0
Auteur du sujet

sujet résolu.

Voici le code qui marche :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
    private function savePermissionsFilessaverecusive($conn_id, $filesPath) {
        function save($conn_id, $filesPath) {
            static $inFolder = array();

            $buff = ftp_rawlist($conn_id, $filesPath);
            foreach ($buff as $oneBuff) {
                $chunks = preg_split("/\s+/", $oneBuff); 
                list($item['rights'], $item['number'], $item['user'], $item['group'], $item['size'], $item['month'], $item['day'], $item['time'], $item['name']) = $chunks;
                $item['type'] = $chunks[0]{0} === 'd' ? 'directory' : 'file';

                if ($item['name'] != '..' && $item['name'] != '.') {                            
                    if ($item['type'] === 'directory') {
                        $inFolder += save($conn_id, $filesPath.'/'.$item['name']);
                    } else {
                        $inFolder[] = $filesPath.'/'.$item['name'];
                    }
                }
            }

            $inFolder[] = $filesPath;

            return $inFolder;
        }

        return save($conn_id, $filesPath);
    }

Ensuite, j"'ai juste à faire:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
$inFolder = $this->savePermissionsFilessaverecusive($conn_id, $filesPath);
//var_dump($inFolder);  // je récupère tout les dossier et fichiers...

// ... on modifie le dossier et dossiers et fichiers qui sont à l'interieur
foreach ($inFolder as $oneInFolder) {
    if (ftp_chmod($conn_id, eval("return({$np});"), $oneInFolder) === false) {
        $error = true;
    }
}

merci beaucoup.

Édité par stephweb

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte