Autor Zpráva
Darker
Profil
Začal jsem si vyrábět zprávce souborů. Trošku jsem si ho vylepšil o uživatelské účty s různými oprávněními. Kromě globálních oprávnění jsem zavedl také oprávnění pro jednotlivé soubory a složky. Ta jsou uložena v XML, které převádím na pole. Oprávnění nišší úrovně (hlouběji) mý vyšší prioritu, ta nad sebou přebije. Všechno pěkně funguje, i převedení cesty na pole oprávnění, ale jedna věc mi vadí, a to že používám eval, a jediná alternativa která mě napadá je nějaká složitá rekurzivní funkce.
Oprávnění:
<?xml version="1.0" standalone="yes"?>
<permissions>
  <******>
    <web><OPT_show_dir>0</OPT_show_dir>
      <admin>
        <OPT_show_dir>1</OPT_show_dir>
        <users>
        <administrator>
         <OPT_show_dir>0</OPT_show_dir>
        </administrator>
        </users>
        <test>
            <OPT_read>1</OPT_read>
            <OPT_rename>0</OPT_rename>
            <OPT_write>0</OPT_write>
            <OPT_delete>1</OPT_delete>

            <OPT_make>1</OPT_make>
        </test>
      </admin>
    </web>
  </******>
</permissions>

A takle pak vypadá pole:
Array
        (
            [******] => Array
                (
                    [web] => Array
                        (
                            [OPT_show_dir] => 0
                            [admin] => Array
                                (
                                    [OPT_show_dir] => 1
                                    [users] => Array
                                        (
                                            [administrator] => Array
                                                (
                                                    [OPT_show_dir] => 0
                                                )

                                        )

                                    [test] => Array
                                        (
                                            [OPT_read] => 1
                                            [OPT_rename] => 0
                                            [OPT_write] => 0
                                            [OPT_delete] => 1
                                            [OPT_make] => 1
                                        )

                                )

                        )

                )

        )

Teď nastává zmíněný problém, sami vidíte, že pole může mít kolik chce úrovní.
function path_permissions($path){
 $actual=$_SESSION['perms'];    //To je pole co jsem vytahl z XML
 $permissions=array();          //sem si budeme ukládat oprávnění
 $options=array("read","write","rename","delete","make","show_dir");//Co hledat
 $path=str_replace(DATA_ROOT,"",realpath($path));
 $path=str_replace("//","/",$path);         //Projistotu
 $path=explode("/",$path);
 
 for($i=count($path)-1;$i>=0;$i--){
  eval('$perms=$actual["'.implode('"]["',$path).'"];');  //Složíme se lobovolně dlouhou adresu v poli
  for($j=0;$j<count($options);$j++){
   if(!isset($permissions[$options[$j]])&&isset($perms["OPT_".$options[$j]])){       //Jedeme zevnitř, takže pokud je přiřazeno, nepřiřazujeme
    $permissions[$options[$j]]=$perms["OPT_".$options[$j]]; 
   };
  };
  unset($path[count($path)-1]);
 }
  $global=$_SESSION['rights']['EXPLORER'];
  for($j=0;$j<count($options);$j++){                     //A nakonec přiřadíme obecná oprávnění tam, kde není nic
   if(!isset($permissions[$options[$j]])&&isset($global[$options[$j]])){
    $permissions[$options[$j]]=$global[$options[$j]]; 
   };
  };   
 return $permissions;
}

Takže otázka zní, jak to udělat chytřeji, lépe a bez eval.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: