From d68b15bac325fb7b81745aa4884f4b95f5663905 Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Mon, 25 May 2020 11:09:32 +0200 Subject: [PATCH] Add default LSprofiles with the name of authenticable object types Consquently adjust LSaccessRigthsMatrixView addon and make some representative change in LSexample for demo --- doc/conf/LSprofile.docbook | 114 ++++++++++++------ .../config.LSobjects.LSsysaccount.php | 5 +- src/conf/config.LSaddons.php | 3 +- .../LSaddons.LSaccessRightsMatrixView.php | 14 ++- src/includes/class/class.LSsession.php | 10 +- 5 files changed, 102 insertions(+), 44 deletions(-) diff --git a/doc/conf/LSprofile.docbook b/doc/conf/LSprofile.docbook index 3992e175..b31f857c 100644 --- a/doc/conf/LSprofile.docbook +++ b/doc/conf/LSprofile.docbook @@ -2,16 +2,56 @@ Profils d'utilisateurs - + Cette section décrit la manière dont sont définis les profils d'utilisateurs - se connectant à l'interface appelés LSprofile. Il est - possible de définir autant de profils d'utilisateurs que l'on souhaite. Pour - chaque profil d'utilisateur, il faudra définir dans quelles parties de - l'annuaire ce profil existe (Exemple : les admistrateurs de groupes existent - uniquement dans la branche de l'annuaire stockant les groupes). Enfin pour - chaque partie de l'annuaire, il faudra définir la manière d'identifier si - l'utilisateur qui se connecte appartient à ce profil. - + se connectant à l'interface appelés LSprofile. Il est possible + d'attribuer un profil à l'utilisateur connecté sur tout ou partie de l'annuaire LDAP. + + + + Profils d'utilisateurs par défaut + Il existe des profils d'utilisateurs par défaut, non liée à la configuration de + l'application: + + + + user + + Tous les utilisateurs connectés à l'utilisateur. Ce &LSprofile; est valide sur l'ensemble de l'annuaire. + + + + + self + + L'utilisateur connecté sur son objet correspondant dans l'annuaire. Ce &LSprofile; est utile pour donner des + droits à l'utilisateur sur lui-même. + + + + + nom du type de l'objet connecté + + Un &LSprofile; du nom du type d'objet utilisateur connecté est automatiquement ajouté à l'utilisateur. + Ainsi, si l'utilisateur connecté est un &LSobject; LSpeople par exemple, il aura le &LSprofile; + LSpeople sur tous l'annuaire. Ce &LSprofile; est utile pour donner des droits à tous un type + d'objets pouvant se connecter à l'application (par exemple, tous les utilisateurs applicatifs). + + + + + + + + + + Profils d'utilisateurs personalisés + Il est possible de définir autant de profils d'utilisateurs que l'on souhaite. Pour chaque profil + d'utilisateur personnalisé, il faudra définir dans quelles parties de l'annuaire ce profil existe (Exemple : + les admistrateurs de groupes existent uniquement dans la branche de l'annuaire stockant les groupes). Enfin + pour chaque partie de l'annuaire, il faudra définir la manière d'identifier si l'utilisateur qui se connecte + appartient à ce profil. + Structure... array ( @@ -27,12 +67,12 @@ ) ), 'LSobjects' => array ( // via une liste d'objet sur lequel l'utilisateur a des pouvoirs - [nom du LSobject] => array ( + [nom du LSobject] => array ( 'attr' => [nom de l'attribut clé], 'attr_value' => [format de la valeur de l'attribut clé], // ou 'filter' => [format du filtre de recherche], - + 'basedn' => [basedn de recherche], 'params' => [configuration de la recherche] ), @@ -56,7 +96,7 @@ ... ),]]> ... - + Le paramètre LSprofiles est un tableau associatif contenant, @@ -66,7 +106,7 @@ la configuration nécessaire pour déterminer si l'utilisateur connecté apparti -Dans chaque configuration de LSprofile, il est possible +Dans chaque configuration de LSprofile, il est possible d'identifier l'appartenance ou non de l'utilisateur connecté de deux manières : @@ -74,9 +114,9 @@ d'identifier l'appartenance ou non de l'utilisateur connecté de deux manières& -Pour une branche de l'annuaire donnée (basedn) : +Pour une branche de l'annuaire donnée (basedn) : en listant les utilisateurs appartenant à ce LSprofile pour -tous les objets de la branche. Il sera possible de lister les utilisateurs dont +tous les objets de la branche. Il sera possible de lister les utilisateurs dont on connait le DN ou de lister les utilisateurs appartenant à une liste stockée dans l'annuaire (par exemple la liste des membres d'un groupe). @@ -103,12 +143,12 @@ groupe). ),]]> ... -Explication : Pour un LSprofile et un -basedn donnés, on définit l'utilisateur appartenant au -LSprofile en donnant son DN. Si on -souhaite lister plusieurs utilisateurs, on utilise un tableau associatif dans +Explication : Pour un LSprofile et un +basedn donnés, on définit l'utilisateur appartenant au +LSprofile en donnant son DN. Si on +souhaite lister plusieurs utilisateurs, on utilise un tableau associatif dans lequel les clés sont les DNs des utilisateurs et les valeurs -associées sont toutes NULL. +associées sont toutes NULL. @@ -130,10 +170,10 @@ associées sont toutes NULL. ),]]> ... -Explication : Pour un LSprofile et un -basedn donnés, on liste les utilisateurs du +Explication : Pour un LSprofile et un +basedn donnés, on liste les utilisateurs du LSprofile référencés dans l'attribut attr -de l'object de type LSobject et selon le format de valeur +de l'object de type LSobject et selon le format de valeur décrit dans attr_value. @@ -148,8 +188,8 @@ décrit dans attr_value. Pour un type de LSobject donné : en listant les objets pour lesquels l'utilisateur aura les droits du LSprofile. Il sera -possible, à travers une recherche paramétrable dans l'annuaire, de lister les -objets pour lesquels l'utilisateur appartiendra au +possible, à travers une recherche paramétrable dans l'annuaire, de lister les +objets pour lesquels l'utilisateur appartiendra au LSprofile. Structure... @@ -157,12 +197,12 @@ objets pour lesquels l'utilisateur appartiendra au [nom d'un LSprofile] => array ( 'LSobjects' => array ( // via un liste d'objet pour lequel l'utilisateur // appartient au LSprofile - [nom du LSobject] => array ( + [nom du LSobject] => array ( 'attr' => [nom de l'attribut clé], 'attr_value' => [format de la valeur de l'attribut clé], // or 'filter' => [format du filtre de recherche], - + 'basedn' => [basedn de recherche], 'params' => [configuration de la recherche] ), @@ -186,7 +226,7 @@ objets pour lesquels l'utilisateur appartiendra au ... ),]]> ... - + Explications : Dans la configuration d'un LSprofile, la valeur clé LSobjects signifie qu'on est dans un cas de la délégation de droits sur des types d'LSobject. Dans ce tableau associatif, il @@ -228,7 +268,7 @@ objets retournés. Les paramètres de la recherche sont : attr - Nom de l'attribut des LSobjets contenant une valeur clé qui + Nom de l'attribut des LSobjets contenant une valeur clé qui permettra d'identifier l'utilisateur comme ayant droit. @@ -238,7 +278,7 @@ objets retournés. Les paramètres de la recherche sont : Le format de la valeur clé prise par l'attribut attr. Ce format est composé à partir des données de l'objet de l'utilisateur - connecté. Voir le paragraphe Format + connecté. Voir le paragraphe Format paramètrable pour plus d'informations sur l'écriture du format. @@ -246,9 +286,9 @@ objets retournés. Les paramètres de la recherche sont : filter - Ce paramètre remplace les paramètres attr et - attr_value. Il est possible ici d'écrire directement le - format paramètrable du filtre recherche dans l'annuaire. Ce filtre sera + Ce paramètre remplace les paramètres attr et + attr_value. Il est possible ici d'écrire directement le + format paramètrable du filtre recherche dans l'annuaire. Ce filtre sera automatiquement agrémenté des conditions sur l'attribut objectclass. Voir le paragraphe Format paramètrable pour plus d'informations sur l'écriture du format. @@ -259,7 +299,7 @@ objets retournés. Les paramètres de la recherche sont : basedn C'est le basedn de la recherche. Il est possible - ainsi de la limiter sur les LSojects d'une branche précise de l'annuaire. + ainsi de la limiter sur les LSojects d'une branche précise de l'annuaire. (Paramètre facultatif) @@ -267,7 +307,7 @@ objets retournés. Les paramètres de la recherche sont : params - C'est un tableau associatif contenant les paramètres étendus de la + C'est un tableau associatif contenant les paramètres étendus de la recherche. Voir le paragraphe Paramètres étendus des recherches dans l'annuaire pour plus de détails. (Paramètre facultatif) @@ -287,6 +327,8 @@ objets retournés. Les paramètres de la recherche sont : LSprofile à l'aide de la clé label. Ce label sera utilisé pour faire référence au LSprofile lorsque nécéssaire. (Paramètre facultatif) - + + + diff --git a/src/conf/LSobjects/config.LSobjects.LSsysaccount.php b/src/conf/LSobjects/config.LSobjects.LSsysaccount.php index ee7a8d80..e4f223e9 100644 --- a/src/conf/LSobjects/config.LSobjects.LSsysaccount.php +++ b/src/conf/LSobjects/config.LSobjects.LSsysaccount.php @@ -48,7 +48,8 @@ $GLOBALS['LSobjects']['LSsysaccount'] = array ( 'linkAttributeValue' => "dn", 'rights' => array( 'admin' => 'w', - 'admingroup' => 'w' + 'admingroup' => 'w', + 'LSsysaccount' => 'r', ), ), ), @@ -78,6 +79,7 @@ $GLOBALS['LSobjects']['LSsysaccount'] = array ( ), 'rights' => array( 'self' => 'r', + 'LSsysaccount' => 'r', 'admin' => 'w', ), 'view' => 1, @@ -139,6 +141,7 @@ $GLOBALS['LSobjects']['LSsysaccount'] = array ( 'multiple' => 1, 'rights' => array( 'self' => 'r', + 'LSsysaccount' => 'r', 'admin' => 'w', ), 'view' => 1, diff --git a/src/conf/config.LSaddons.php b/src/conf/config.LSaddons.php index c527532b..350814e3 100644 --- a/src/conf/config.LSaddons.php +++ b/src/conf/config.LSaddons.php @@ -24,5 +24,6 @@ $GLOBALS['LSaddons']['loads'] = array ( 'samba', 'posix', 'ftp', - 'maildir' + 'maildir', + 'LSaccessRightsMatrixView' ); diff --git a/src/includes/addons/LSaddons.LSaccessRightsMatrixView.php b/src/includes/addons/LSaddons.LSaccessRightsMatrixView.php index 60cc58be..4510c5de 100644 --- a/src/includes/addons/LSaddons.LSaccessRightsMatrixView.php +++ b/src/includes/addons/LSaddons.LSaccessRightsMatrixView.php @@ -61,9 +61,17 @@ function LSaccessRightsMatrixView() { $LSprofiles = array( 'user' => _('All connected users'), ); + // Authenticable user objects types + $authObjTypes = LSauth :: getAuthObjectTypes(); + foreach ($authObjTypes as $objType => $objParams) + if (LSsession :: loadLSobject($objType)) + $LSprofiles[$objType] = LSldapObject :: getLabel($objType); + + // Custom configured LSprofiles if (isset(LSsession :: $ldapServer["LSprofiles"]) && is_array(LSsession :: $ldapServer["LSprofiles"])) foreach(LSsession :: $ldapServer["LSprofiles"] as $LSprofile => $LSprofile_conf) $LSprofiles[$LSprofile] = (isset($LSprofile_conf['label'])?__($LSprofile_conf['label']):$LSprofile); + $LSobjects = array(); foreach (LSsession :: $ldapServer["LSaccess"] as $LSobject) { if (!LSsession :: loadLSobject($LSobject)) @@ -74,7 +82,7 @@ function LSaccessRightsMatrixView() { foreach(LSconfig :: get("LSobjects.$LSobject.attrs", array()) as $attr_name => $attr_config) { $raw_attr_rights = LSconfig :: get('rights', array(), 'array', $attr_config); $attr_rights = array(); - if ($LSobject == LSsession :: get('authenticated_user_type')) + if (array_key_exists($LSobject, $authObjTypes)) $attr_rights['self'] = LSconfig :: get('self', False, null, $raw_attr_rights); foreach(array_keys($LSprofiles) as $LSprofile) { $attr_rights[$LSprofile] = LSconfig :: get($LSprofile, False, null, $raw_attr_rights); @@ -90,7 +98,7 @@ function LSaccessRightsMatrixView() { foreach(LSconfig :: get("LSobjects.$LSobject.LSrelation", array()) as $relation_name => $relation_config) { $raw_relation_rights = LSconfig :: get('rights', array(), 'array', $relation_config); $relation_rights = array(); - if ($LSobject == LSsession :: get('authenticated_user_type')) + if (array_key_exists($LSobject, $authObjTypes)) $relation_rights['self'] = LSconfig :: get('self', False, null, $raw_relation_rights); foreach(array_keys($LSprofiles) as $LSprofile) { $relation_rights[$LSprofile] = LSconfig :: get($LSprofile, False, null, $raw_relation_rights); @@ -112,7 +120,7 @@ function LSaccessRightsMatrixView() { reset($LSobjects); $LSobject = (isset($_REQUEST['LSobject']) && array_key_exists($_REQUEST['LSobject'], $LSobjects)?$_REQUEST['LSobject']:key($LSobjects)); - if ($LSobject == LSsession :: get('authenticated_user_type')) + if (array_key_exists($LSobject, $authObjTypes)) $LSprofiles = array_merge(array('self' => _('The user him-self')), $LSprofiles); LSlog :: get_logger('LSaddon_LSaccessRightsMatrixView') -> debug($LSobjects); diff --git a/src/includes/class/class.LSsession.php b/src/includes/class/class.LSsession.php index 6cd5160e..fec998af 100644 --- a/src/includes/class/class.LSsession.php +++ b/src/includes/class/class.LSsession.php @@ -1896,9 +1896,10 @@ class LSsession { $access=array(); foreach(self :: $ldapServer['LSaccess'] as $objectType) { if (self :: loadLSobject($objectType)) { - if (self :: canAccess($objectType)) { - $access[$objectType] = LSconfig :: get('LSobjects.'.$objectType.'.label'); - } + if (self :: canAccess($objectType)) + $access[$objectType] = $objectType :: getLabel(); + else + self :: log_debug("loadLSaccess(): authenticated user have no access to $objectType"); } } $LSaccess[self :: $topDn] = $access; @@ -2005,6 +2006,9 @@ class LSsession { public static function whoami($dn) { $retval = array('user'); + if (self :: $LSuserObjectType) + $retval[] = self :: $LSuserObjectType; + foreach(self :: $LSprofiles as $profile => $infos) { if(self :: isLSprofile($dn,$profile)) { $retval[]=$profile;