Gestion des droits automatisé ('sudo doc/set_permissions.php')

This commit is contained in:
xdrm-brackets 2016-05-22 12:22:38 +02:00
parent 1c25256963
commit 9d6c0b7497
8 changed files with 248 additions and 2 deletions

View File

@ -1,5 +1,5 @@
# Gestion des pages d'erreur personnalisées
ErrorDocument 403 view/error.php
ErrorDocument 403 /index.php
# Redirection vers index.php (Router)

2
doc/.htaccess Normal file
View File

@ -0,0 +1,2 @@
Order deny,allow
Deny from all

44
doc/permissions.json Normal file
View File

@ -0,0 +1,44 @@
{
"root": "/var/www/socioview",
"umask": 2,
"permissions": {
".htaccess": { "chown": "xdrm:www-data", "chmod": "750" },
"public": { "chown": "xdrm:www-data", "chmod": "750" },
"private": { "chown": "xdrm:xdrm", "chmod": "700", ".htaccess": "Order deny,allow\nDeny from all" },
"phponly": { "chown": "xdrm:www-data", "chmod": "770", ".htaccess": "Order deny,allow\nDeny from all" },
"php": { "chown": "xdrm:www-data", "chmod": "770" }
},
"files": {
"permissions": "public",
".git": { "permissions": "private" },
"config": { "permissions": "private" },
"manager": { "permissions": "private" },
"src": {
"permissions": "phponly",
"static": "public"
},
"tmp": {
"permissions": "php"
},
".htaccess": { "permissions": "public" },
"doc": { "permissions": "private" }
}
}

39
doc/permissions.json~ Normal file
View File

@ -0,0 +1,39 @@
{
"root": "/var/www/socioview",
"permissions": {
"public": { "chown": "xdrm:www-data", "chmod": 750 },
"private": { "chown": "xdrm:xdrm", "chmod": 700, ".htaccess": "Order deny,allow\nDeny from all" },
"phponly": { "chown": "xdrm:www-data", "chmod": 770, ".htaccess": "Order deny,allow\nDeny from all" },
"php": { "chown": "xdrm:www-data", "chmod": 770 }
},
"files": {
"permissions": "public",
".git": { "permissions": "private" },
"config": { "permissions": "private" },
"manager": { "permissions": "private" },
"src": {
"permissions": "phponly",
"static": "public"
},
"tmp": {
"permissions": "php"
},
".htaccess": { "permissions": "private" }
}
}

157
doc/set_permissions.php Normal file
View File

@ -0,0 +1,157 @@
<?php
define('__ROOT__', dirname(dirname(__FILE__)));
/* CHARGE LA CONFIGURATION DES DROITS
*
*/
function loadConfig(){
$config = json_decode( file_get_contents(__ROOT__.'/doc/permissions.json'), true );
// Si erreur
if( is_null($config) )
return false;
return $config;
}
/* DEFINIT LES DROITS DE MANIERE RECURSIVE
*
*/
function chmodR($dirOrFile, $chmod=null, $chown=null){
/* [0] On vérifie que la ressource existe
=========================================================*/
if( !file_exists($dirOrFile) )
return false;
/* [1] Si c'est un fichier simple ou un dossier
=========================================================*/
echo "$dirOrFile, $chown, $chmod\n";
// On lui donne les droits
if( !is_null($chmod) )
chmod($dirOrFile, intval($chmod, 8) );
// Et un propriétaire
if( !is_null($chown) ){
// On decupde 'owner:group' en un tableau
$owners = explode(':', $chown);
// On définit le propriétaire
chown($dirOrFile, $owners[0]);
// On définit le groupe
chgrp($dirOrFile, $owners[1]);
}
/* [2] Si c'est un dossier
=========================================================*/
if( is_dir($dirOrFile) ){
// On récupère son contenu
$content = scandir($dirOrFile);
// On supprime les valeurs inutiles et on met le chemin en absolu
foreach($content as $i=>$file){
// Si c'est . ou .., on passe au suivant
if( $file == '.' || $file == '..' ){
unset($content[$i]);
continue;
}
// Sinon, on lance recursivement
chmodR( implode('/', array_merge(explode('/', $dirOrFile), array($file))), $chmod, $chown );
}
}
}
/* APPLIQUE LES DROITS SUR UN DOSSIER EN FONCTION DE LA CONFIG
*
*/
function applyPermissions($parent, $children, $permissions){
/* [0] Si une permission est définie, on l'applique
=========================================================*/
/* (0) Si la permission existe et est référencée */
if( isset($children['permissions']) && isset($permissions[$children['permissions']]) ){
// On récupère les permissions
$permission = $permissions[$children['permissions']];
/* (1) Valeur par défaut des propriétaires si n'est pas défini */
if( !isset($permission['chown']) )
$permission['chown'] = null;
/* (2) Valeur par défaut des droits si n'est pas défini */
if( !isset($permission['chmod']) )
$permission['chmod'] = null;
/* (3) Gestion du .htaccess, si défini et si un dossier */
if( isset($permission['.htaccess']) && is_dir($parent) ){
echo 'creating '."$parent/.htaccess\n";
$fht = fopen("$parent/.htaccess", 'w');
fwrite($fht, $permission['.htaccess']);
fclose($fht);
/* (4) On applique les permissions sur le .htaccess (par défaut depuis config) */
chmodR("$parent/.htaccess", $permissions['.htaccess']['chmod'], $permissions['.htaccess']['chown']);
}
/* (5) On retire les permissions de la liste des enfants pour la suite */
unset($children['permissions']);
}
/* [1] Pour chaque enfant, s'il y en a
=========================================================*/
/* (1) On lance récursivement sur tous les enfants */
if( is_array($children) )
foreach($children as $child=>$subChildren)
applyPermissions("$parent/$child", $subChildren, $permissions);
}
/* [1] On charge la configuration
=========================================================*/
$config = loadConfig();
// Si erreur de configuration
if( is_null($config) ){
echo 'Config error';
exit();
}
/* [2] Gestion de 'umask' si défini
=========================================================*/
chdir($config['root']);
if( isset($config['umask']) )
umask( decoct($config['umask']) );
/* [3] On traite toute l'arborescence
=========================================================*/
applyPermissions($config['root'], $config['files'], $config['permissions']);
?>

2
manager/.htaccess Normal file
View File

@ -0,0 +1,2 @@
Order deny,allow
Deny from all

2
src/.htaccess Normal file
View File

@ -0,0 +1,2 @@
Order deny,allow
Deny from all