From 6faa241140c6cd43a35d715ff707fb468801028c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=B4me=20Chilliet?= <come@opensides.be>
Date: Thu, 24 May 2018 15:06:36 +0200
Subject: [PATCH] :sparkles: feat(core) Moved objectClass list to static plInfo

This allows to generate filters automagically most of the time and avoid
 duplicated informations.

issue #5135
---
 include/class_config.inc                         |  2 ++
 include/class_pluglist.inc                       |  7 +++++++
 include/simpleplugin/class_simplePlugin.inc      | 13 +++++++++----
 plugins/admin/acl/class_aclAssignment.inc        |  4 +---
 plugins/admin/aclrole/class_aclRole.inc          |  4 +---
 plugins/admin/departments/class_country.inc      |  7 ++++---
 plugins/admin/departments/class_dcObject.inc     |  7 +++----
 plugins/admin/departments/class_department.inc   | 11 +++++------
 plugins/admin/departments/class_domain.inc       |  7 +++----
 plugins/admin/departments/class_locality.inc     |  8 ++++----
 plugins/admin/departments/class_organization.inc |  8 ++++----
 plugins/admin/groups/class_ogroup.inc            |  5 ++---
 plugins/admin/groups/class_roleGeneric.inc       |  4 +---
 plugins/config/class_configInLdap.inc            |  5 ++---
 plugins/config/class_dashBoardConfig.inc         |  3 +--
 plugins/config/class_mainPluginsConfig.inc       | 13 ++++++-------
 plugins/config/class_pluginsConfigInLdap.inc     | 10 +++++-----
 plugins/config/class_recoveryConfig.inc          |  3 +--
 plugins/personal/generic/class_user.inc          | 12 +++++-------
 19 files changed, 66 insertions(+), 67 deletions(-)

diff --git a/include/class_config.inc b/include/class_config.inc
index ee7cb0fb4..b32759342 100644
--- a/include/class_config.inc
+++ b/include/class_config.inc
@@ -829,6 +829,8 @@ class config
               if (!preg_match('/^\(.*\)$/', $value['filter'])) {
                 $value['filter'] = '('.$value['filter'].')';
               }
+            } elseif (isset($plInfo['plFilter'])) {
+              $value['filter'] = $plInfo['plFilter'];
             } else {
               $value['filter'] = NULL;
             }
diff --git a/include/class_pluglist.inc b/include/class_pluglist.inc
index 8b83ec7ce..9bda4a658 100644
--- a/include/class_pluglist.inc
+++ b/include/class_pluglist.inc
@@ -150,6 +150,13 @@ class pluglist {
         if (!isset($infos['plTitle']) && isset($infos['plShortName'])) {
           $infos['plTitle'] = $infos['plShortName'];
         }
+        if (!empty($infos['plObjectClass']) && !isset($infos['plFilter'])) {
+          if (count($infos['plObjectClass']) == 1) {
+            $infos['plFilter'] = '(objectClass='.$infos['plObjectClass'][0].')';
+          } else {
+            $infos['plFilter'] = '(&(objectClass='.implode(')(objectClass=', $infos['plObjectClass']).'))';
+          }
+        }
         if (isset($infos['plFilter'])) {
           $infos['plFilterObject'] = ldapFilter::parse($infos['plFilter']);
         }
diff --git a/include/simpleplugin/class_simplePlugin.inc b/include/simpleplugin/class_simplePlugin.inc
index f6b31f7bb..fd710936f 100644
--- a/include/simpleplugin/class_simplePlugin.inc
+++ b/include/simpleplugin/class_simplePlugin.inc
@@ -153,6 +153,12 @@ class simplePlugin
     $this->parent   = $parent;
     $this->mainTab  = $mainTab;
 
+    $plInfo = pluglist::pluginInfos(get_class($this));
+
+    if (isset($plInfo['plObjectClass'])) {
+      $this->objectclasses = $plInfo['plObjectClass'];
+    }
+
     if ($attributesInfo === NULL) {
       $attributesInfo = $this->getAttributesInfo();
     }
@@ -188,11 +194,10 @@ class simplePlugin
 
     /* Ensure that we've a valid acl_category set */
     if (empty($this->acl_category)) {
-      $tmp = pluglist::pluginInfos(get_class($this));
-      if (isset($tmp['plCategory'])) {
-        $c = key($tmp['plCategory']);
+      if (isset($plInfo['plCategory'])) {
+        $c = key($plInfo['plCategory']);
         if (is_numeric($c)) {
-          $c = $tmp['plCategory'][0];
+          $c = $plInfo['plCategory'][0];
         }
         $this->acl_category = $c.'/';
       }
diff --git a/plugins/admin/acl/class_aclAssignment.inc b/plugins/admin/acl/class_aclAssignment.inc
index d4284f254..bf2f043a7 100644
--- a/plugins/admin/acl/class_aclAssignment.inc
+++ b/plugins/admin/acl/class_aclAssignment.inc
@@ -260,8 +260,6 @@ class ACLsAssignmentAttribute extends DialogOrderedArrayAttribute
 
 class aclAssignment extends simplePlugin
 {
-  var $objectclasses  = array('gosaAcl');
-
   static function plInfo()
   {
     global $config;
@@ -269,7 +267,6 @@ class aclAssignment extends simplePlugin
       'aclAssignment' => array(
         'aclCategory' => 'acl',
         'name'        => _('ACL assignment'),
-        'filter'      => 'objectClass=gosaAcl',
         'ou'          => '',
         'icon'        => 'geticon.php?context=categories&icon=acl&size=16',
         'tabClass'    => 'simpleTabs_noSpecial',
@@ -284,6 +281,7 @@ class aclAssignment extends simplePlugin
     return array(
       'plShortName'   => _('ACL Assignment'),
       'plDescription' => _('Access control roles assignment'),
+      'plObjectClass' => array('gosaAcl'),
       'plObjectType'  => $oc,
       'plForeignKeys'  => array(
         'gosaAclEntry' => array(
diff --git a/plugins/admin/aclrole/class_aclRole.inc b/plugins/admin/aclrole/class_aclRole.inc
index 714d5d02c..d1c738d26 100644
--- a/plugins/admin/aclrole/class_aclRole.inc
+++ b/plugins/admin/aclrole/class_aclRole.inc
@@ -69,17 +69,15 @@ class ACLsAttribute extends DialogOrderedArrayAttribute
 
 class aclRole extends simplePlugin
 {
-  var $objectclasses  = array('top','gosaRole');
-
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Role'),
       'plDescription' => _('Access control roles'),
+      'plObjectClass' => array('gosaRole'),
       'plObjectType'  => array('aclRole' => array(
         'aclCategory' => 'acl',
         'name'        => _('ACL role'),
-        'filter'      => 'objectClass=gosaRole',
         'ou'          => get_ou('aclRoleRDN'),
         'icon'        => 'geticon.php?context=categories&icon=acl&size=16',
       )),
diff --git a/plugins/admin/departments/class_country.inc b/plugins/admin/departments/class_country.inc
index ddc06d92b..d38ef6702 100644
--- a/plugins/admin/departments/class_country.inc
+++ b/plugins/admin/departments/class_country.inc
@@ -20,18 +20,19 @@
 
 class country extends department
 {
-  static $namingAttr  = "c";
-  var $structuralOC   = array("country");
+  static protected $namingAttr  = 'c';
+  protected $structuralOC       = array('country');
 
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Country'),
       'plDescription' => _('Country'),
+      'plObjectClass' => array('gosaDepartment'),
+      'plFilter'      => '(&(objectClass=country)(objectClass=gosaDepartment))',
       'plObjectType'  => array('country' => array(
         'aclCategory' => 'department',
         'name'        => _('Country'),
-        'filter'      => '(&(objectClass=country)(objectClass=gosaDepartment))',
         'ou'          => '',
         'icon'        => 'geticon.php?context=types&icon=country&size=16',
         'tabClass'    => 'deptabs',
diff --git a/plugins/admin/departments/class_dcObject.inc b/plugins/admin/departments/class_dcObject.inc
index ced37a4e7..66cb59723 100644
--- a/plugins/admin/departments/class_dcObject.inc
+++ b/plugins/admin/departments/class_dcObject.inc
@@ -20,19 +20,18 @@
 
 class dcObject extends department
 {
-  static $namingAttr  = "dc";
-  var $objectclasses  = array("top", "dcObject", "gosaDepartment");
-  var $structuralOC   = array("locality");
+  static protected $namingAttr  = 'dc';
+  protected $structuralOC       = array('locality');
 
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Domain Component'),
       'plDescription' => _('Domain Component'),
+      'plObjectClass' => array('dcObject', 'gosaDepartment'),
       'plObjectType'  => array('dcObject' => array(
         'aclCategory' => 'department',
         'name'        => _('Domain Component'),
-        'filter'      => '(&(objectClass=dcObject)(objectClass=gosaDepartment))',
         'ou'          => '',
         'icon'        => 'geticon.php?context=types&icon=dc&size=16',
         'tabClass'    => 'deptabs',
diff --git a/plugins/admin/departments/class_department.inc b/plugins/admin/departments/class_department.inc
index ddf29b177..3bd3c287e 100644
--- a/plugins/admin/departments/class_department.inc
+++ b/plugins/admin/departments/class_department.inc
@@ -21,23 +21,22 @@
 
 class department extends simplePlugin
 {
-  static $namingAttr = 'ou';
-
-  /* Do not append the structural object classes here, they are added dynamically in the constructor */
-  var $objectclasses  = array("top", "gosaDepartment");
-  var $structuralOC   = array("organizationalUnit");
+  static protected $namingAttr  = 'ou';
+  protected $structuralOC       = array('organizationalUnit');
 
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Department'),
       'plDescription' => _('Departments'),
+      /* Do not append the structural object classes here, they are added dynamically in the constructor */
+      'plObjectClass' => array('gosaDepartment'),
+      'plFilter'      => '(&(objectClass=organizationalUnit)(objectClass=gosaDepartment))',
       'plCategory'    => array('department' => array('objectClass' => 'gosaDepartment', 'description' => _('Departments'))),
       'plObjectType'  =>
         array(
           'department' => array(
             'name'      => _('Department'),
-            'filter'    => '(&(objectClass=organizationalUnit)(objectClass=gosaDepartment))',
             'ou'        => '',
             'icon'      => 'geticon.php?context=places&icon=folder&size=16',
             'tabClass'  => 'deptabs',
diff --git a/plugins/admin/departments/class_domain.inc b/plugins/admin/departments/class_domain.inc
index 01994317c..7a01aa2ea 100644
--- a/plugins/admin/departments/class_domain.inc
+++ b/plugins/admin/departments/class_domain.inc
@@ -20,19 +20,18 @@
 
 class domain extends department
 {
-  static $namingAttr  = "dc";
-  var $objectclasses  = array("top", "domain", "gosaDepartment");
-  var $structuralOC   = array("domain");
+  static protected $namingAttr  = 'dc';
+  protected $structuralOC       = array('domain');
 
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Domain'),
       'plDescription' => _('Domain'),
+      'plObjectClass' => array('domain', 'gosaDepartment'),
       'plObjectType'  => array('domain' => array(
         'aclCategory' => 'department',
         'name'        => _('Domain'),
-        'filter'      => '(&(objectClass=domain)(objectClass=gosaDepartment))',
         'ou'          => '',
         'icon'        => 'geticon.php?context=types&icon=domain&size=16',
         'tabClass'    => 'deptabs',
diff --git a/plugins/admin/departments/class_locality.inc b/plugins/admin/departments/class_locality.inc
index 6f0e8125b..99483b64c 100644
--- a/plugins/admin/departments/class_locality.inc
+++ b/plugins/admin/departments/class_locality.inc
@@ -20,19 +20,19 @@
 
 class locality extends department
 {
-  static $namingAttr  = "l";
-  var $objectclasses  = array("top", "gosaDepartment");
-  var $structuralOC   = array("locality");
+  static protected $namingAttr  = 'l';
+  protected $structuralOC       = array('locality');
 
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Locality'),
       'plDescription' => _('Locality'),
+      'plObjectClass' => array('gosaDepartment'),
+      'plFilter'      => '(&(!(objectClass=dcObject))(objectClass=locality)(objectClass=gosaDepartment))',
       'plObjectType'  => array('locality' => array(
         'aclCategory' => 'department',
         'name'        => _('Locality'),
-        'filter'      => '(&(!(objectClass=dcObject))(objectClass=locality)(objectClass=gosaDepartment))',
         'ou'          => '',
         'icon'        => 'geticon.php?context=types&icon=locality&size=16',
         'tabClass'    => 'deptabs',
diff --git a/plugins/admin/departments/class_organization.inc b/plugins/admin/departments/class_organization.inc
index d633dc3f2..ff0dac558 100644
--- a/plugins/admin/departments/class_organization.inc
+++ b/plugins/admin/departments/class_organization.inc
@@ -20,19 +20,19 @@
 
 class organization extends department
 {
-  static $namingAttr  = "o";
-  var $objectclasses  = array("top", "gosaDepartment");
-  var $structuralOC   = array("organization");
+  static protected $namingAttr  = 'o';
+  protected $structuralOC       = array('organization');
 
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Organization'),
       'plDescription' => _('Organization'),
+      'plObjectClass' => array('gosaDepartment'),
+      'plFilter'      => '(&(objectClass=organization)(objectClass=gosaDepartment))',
       'plObjectType'  => array('organization' => array(
         'aclCategory' => 'department',
         'name'        => _('Organization'),
-        'filter'      => '(&(objectClass=organization)(objectClass=gosaDepartment))',
         'ou'          => '',
         'icon'        => 'geticon.php?context=types&icon=organization&size=16',
         'tabClass'    => 'deptabs',
diff --git a/plugins/admin/groups/class_ogroup.inc b/plugins/admin/groups/class_ogroup.inc
index c34532dee..ed476f1c0 100644
--- a/plugins/admin/groups/class_ogroup.inc
+++ b/plugins/admin/groups/class_ogroup.inc
@@ -151,8 +151,6 @@ class ObjectSelectDialog extends GenericSelectDialog
 
 class ogroup extends simplePlugin
 {
-  var $objectclasses  = array('groupOfNames', 'gosaGroupOfNames');
-
   var $used_workstations = array();
 
   protected $savedTypedMembers;
@@ -176,11 +174,12 @@ class ogroup extends simplePlugin
       'plDescription' => _('Object group information'),
       'plFilter'      => '(objectClass=groupOfNames)',
       'plPriority'    => 1,
+      'plObjectClass' => array('groupOfNames', 'gosaGroupOfNames'),
+      'plFilter'      => '(objectClass=groupOfNames)',
       'plObjectType'  => array('ogroup' => array(
         'name'        => _('Group'),
         'description' => _('Group'),
         'ou'          => get_ou('ogroupRDN'),
-        'filter'      => 'objectClass=groupOfNames',
         'icon'        => 'geticon.php?context=types&icon=resource-group&size=16',
         'tabClass'    => 'ogrouptabs',
       )),
diff --git a/plugins/admin/groups/class_roleGeneric.inc b/plugins/admin/groups/class_roleGeneric.inc
index 9569ee633..7d16dcb54 100644
--- a/plugins/admin/groups/class_roleGeneric.inc
+++ b/plugins/admin/groups/class_roleGeneric.inc
@@ -47,20 +47,18 @@ class RoleMembersAttribute extends UsersAttribute
 
 class roleGeneric extends simplePlugin
 {
-  var $objectclasses = array('organizationalRole');
-
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Role'),
       'plDescription' => _('Role information'),
+      'plObjectClass' => array('organizationalRole'),
       'plFilter'      => '(&(objectClass=organizationalRole)(!(objectClass=simpleSecurityObject)))',
       'plObjectType'  => array('role' =>
         array(
           'name'        => _('Role'),
           'description' => _('Organizational role'),
           'ou'          => get_ou('roleRDN'),
-          'filter'      => '(&(objectClass=organizationalRole)(!(objectClass=simpleSecurityObject)))',
           'icon'        => 'geticon.php?context=types&icon=role&size=16',
           'mainAttr'    => 'cn',
         )
diff --git a/plugins/config/class_configInLdap.inc b/plugins/config/class_configInLdap.inc
index bdc2e6624..77d44516d 100644
--- a/plugins/config/class_configInLdap.inc
+++ b/plugins/config/class_configInLdap.inc
@@ -21,7 +21,7 @@
 /* Debug level is an OR combination of several values */
 class DebugLevelAttribute extends SetAttribute
 {
-  protected function loadAttrValue ($attrs)
+  protected function loadAttrValue (array $attrs)
   {
     if (isset($attrs[$this->getLdapName()])) {
       $value = $attrs[$this->getLdapName()][0];
@@ -48,8 +48,6 @@ class DebugLevelAttribute extends SetAttribute
 
 class configInLdap extends simplePlugin
 {
-  var $objectclasses  = array("fusionDirectoryConf");
-
   static function plInfo()
   {
     return array(
@@ -57,6 +55,7 @@ class configInLdap extends simplePlugin
       'plTitle'         => _('FusionDirectory configuration'),
       'plDescription'   => _('Configuration screen of FusionDirectory'),
       'plIcon'          => 'geticon.php?context=categories&icon=settings&size=48',
+      'plObjectClass'   => array('fusionDirectoryConf'),
       'plObjectType'    => array(
         'configuration' => array(
           'name'      => _('FusionDirectory configuration'),
diff --git a/plugins/config/class_dashBoardConfig.inc b/plugins/config/class_dashBoardConfig.inc
index 7fbc9dce8..f506098ff 100644
--- a/plugins/config/class_dashBoardConfig.inc
+++ b/plugins/config/class_dashBoardConfig.inc
@@ -20,14 +20,13 @@
 
 class dashboardConfig extends simplePlugin
 {
-  var $objectclasses  = array('fdDashboardPluginConf');
-
   static function plInfo()
   {
     return array(
       'plShortName'     => _('Dashboard configuration'),
       'plDescription'   => _('FusionDirectory dashboard plugin configuration'),
       'plCategory'      => array('configuration'),
+      'plObjectClass'   => array('fdDashboardPluginConf'),
       'plObjectType'    => array('smallConfig'),
 
       'plProvidedAcls'  => parent::generatePlProvidedAcls(static::getAttributesInfo())
diff --git a/plugins/config/class_mainPluginsConfig.inc b/plugins/config/class_mainPluginsConfig.inc
index 47a46468d..dd6e4fef3 100644
--- a/plugins/config/class_mainPluginsConfig.inc
+++ b/plugins/config/class_mainPluginsConfig.inc
@@ -20,17 +20,16 @@
 
 class mainPluginsConfig extends simplePlugin
 {
-  var $objectclasses  = array("fusionDirectoryPluginsConf");
-
   static function plInfo()
   {
     return array(
-      "plShortName"     => _("Plugins configuration"),
-      "plDescription"   => _("FusionDirectory plugins configuration"),
-      "plCategory"      => array("configuration"),
-      "plObjectType"    => array("smallConfig"),
+      'plShortName'     => _('Plugins configuration'),
+      'plDescription'   => _('FusionDirectory plugins configuration'),
+      'plCategory'      => array('configuration'),
+      'plObjectClass'   => array('fusionDirectoryPluginsConf'),
+      'plObjectType'    => array('smallConfig'),
 
-      "plProvidedAcls"  => parent::generatePlProvidedAcls(static::getAttributesInfo())
+      'plProvidedAcls'  => parent::generatePlProvidedAcls(static::getAttributesInfo())
     );
   }
 
diff --git a/plugins/config/class_pluginsConfigInLdap.inc b/plugins/config/class_pluginsConfigInLdap.inc
index eef1a50d6..941fae92f 100644
--- a/plugins/config/class_pluginsConfigInLdap.inc
+++ b/plugins/config/class_pluginsConfigInLdap.inc
@@ -26,12 +26,12 @@ class pluginsConfigInLdap extends multiPlugin
   static function plInfo()
   {
     return array(
-      "plShortName"   => _("Plugins"),
-      "plDescription" => _("Configuration for plugins"),
-      "plPriority"    => 20,
-      "plObjectType"  => array("configuration"),
+      'plShortName'   => _('Plugins'),
+      'plDescription' => _('Configuration for plugins'),
+      'plPriority'    => 20,
+      'plObjectType'  => array('configuration'),
 
-      "plProvidedAcls"  => array()
+      'plProvidedAcls'  => array()
     );
   }
 }
diff --git a/plugins/config/class_recoveryConfig.inc b/plugins/config/class_recoveryConfig.inc
index 6f0ed6221..905cec0c6 100644
--- a/plugins/config/class_recoveryConfig.inc
+++ b/plugins/config/class_recoveryConfig.inc
@@ -20,13 +20,12 @@
 
 class recoveryConfig extends simplePlugin
 {
-  var $objectclasses  = array('fdPasswordRecoveryConf');
-
   static function plInfo()
   {
     return array(
       'plShortName'     => _('Password recovery'),
       'plDescription'   => _('Settings for the password recovery feature'),
+      'plObjectClass'   => array('fdPasswordRecoveryConf'),
       'plObjectType'    => array('configuration'),
 
       'plProvidedAcls'  => parent::generatePlProvidedAcls(static::getAttributesInfo())
diff --git a/plugins/personal/generic/class_user.inc b/plugins/personal/generic/class_user.inc
index 575196e5e..4e4ec1704 100644
--- a/plugins/personal/generic/class_user.inc
+++ b/plugins/personal/generic/class_user.inc
@@ -84,7 +84,7 @@ class UserPasswordAttribute extends CompositeAttribute
   }
 
   /* We need to handle method select disabling manually */
-  function renderAttribute(&$attributes, $readOnly)
+  function renderAttribute(array &$attributes, $readOnly)
   {
     global $config;
     if ($this->visible) {
@@ -110,7 +110,7 @@ class UserPasswordAttribute extends CompositeAttribute
 
   /*! \brief Loads this attribute value from the attrs array
    */
-  protected function loadAttrValue ($attrs)
+  protected function loadAttrValue (array $attrs)
   {
     if (isset($attrs[$this->getLdapName()])) {
       $this->setValue($this->inputValue($attrs[$this->getLdapName()][0]));
@@ -186,7 +186,7 @@ class UserPasswordAttribute extends CompositeAttribute
     return array($pw_storage, $password, $password, $value, $locked);
   }
 
-  function writeValues($values)
+  function writeValues(array $values)
   {
     if ($this->needPassword[$values[0]] && ($values[1] == '')) {
       if ($this->plugin->is_template) {
@@ -268,8 +268,6 @@ class PostalAddressAttribute extends TextAreaAttribute
 
 class user extends simplePlugin
 {
-  var $objectclasses  = array('inetOrgPerson','organizationalPerson','person');
-
   private $was_locked;
 
   static function plInfo()
@@ -277,14 +275,14 @@ class user extends simplePlugin
     return array(
       'plShortName'   => _('User'),
       'plDescription' => _('User account information'),
-      'plFilter'      => '(objectClass=inetOrgPerson)',
       'plIcon'        => 'geticon.php?context=applications&icon=user-info&size=48',
       'plSmallIcon'   => 'geticon.php?context=applications&icon=user-info&size=16',
       'plSelfModify'  => TRUE,
+      'plObjectClass' => array('inetOrgPerson','organizationalPerson','person'),
+      'plFilter'      => '(objectClass=inetOrgPerson)',
       'plObjectType'  => array('user' => array(
         'name'        => _('User'),
         'description' => _('User account'),
-        'filter'      => '(objectClass=inetOrgPerson)',
         'mainAttr'    => 'uid',
         'nameAttr'    => 'cn',
         'icon'        => 'geticon.php?context=types&icon=user&size=16',
-- 
GitLab