From 8355cd17d885103b033edfc9d66baa3dbf0e1121 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=B4me=20Chilliet?= <come@opensides.be>
Date: Wed, 19 Sep 2018 11:13:06 +0200
Subject: [PATCH] :sparkles: feat(core) Add subtabs information available for
 multiPlugin configuration tab

This fixes ACL search for plugins configuration attributes and allow to
 get their values through webservice ls method and objects::ls

issue #5888
---
 include/class_config.inc                     |  5 ++++-
 include/class_userinfo.inc                   | 18 ++++++++++++++++--
 plugins/config/class_pluginsConfigInLdap.inc |  5 ++---
 3 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/include/class_config.inc b/include/class_config.inc
index e4535efca..029cecb7a 100644
--- a/include/class_config.inc
+++ b/include/class_config.inc
@@ -797,10 +797,13 @@ class config
     foreach ($plist->info as $class => &$plInfo) {
       if (isset($plInfo['plObjectType'])) {
         $entry = array('CLASS' => $class,'NAME' => $plInfo['plShortName']);
+        if (isset($plInfo['plSubTabs'])) {
+          $entry['SUBTABS'] = strtoupper($plInfo['plSubTabs']).'TABS';
+        }
         foreach ($plInfo['plObjectType'] as $key => $value) {
           if (is_numeric($key)) {
             /* This is not the main tab */
-            $tabclass = strtoupper($value)."TABS";
+            $tabclass = strtoupper($value).'TABS';
             if (($tabclass == 'GROUPTABS') && class_available('mixedGroup')) {
               $tabclass = 'OGROUP-USERTABS';
             }
diff --git a/include/class_userinfo.inc b/include/class_userinfo.inc
index 341c27e3f..904f0dd1c 100644
--- a/include/class_userinfo.inc
+++ b/include/class_userinfo.inc
@@ -1008,16 +1008,30 @@ class userinfo
   function getAttributeCategory($type, $attribute)
   {
     global $config;
-    $infos    = objects::infos($type);
-    $tabs     = $config->data['TABS'][$infos['tabGroup']];
+
     if (in_array_ics($attribute, array('objectClass', 'dn'))) {
       return TRUE;
     }
+
+    if (is_array($type)) {
+      /* Used for recursion through subtabs */
+      $tabs = $type;
+    } else {
+      /* Usual workflow */
+      $infos  = objects::infos($type);
+      $tabs   = $config->data['TABS'][$infos['tabGroup']];
+    }
     foreach ($tabs as $tab) {
       $acls = pluglist::pluginInfos($tab['CLASS'])['plProvidedAcls'];
       if (isset($acls[$attribute])) {
         return $infos['aclCategory'].'/'.$tab['CLASS'];
       }
+      if (isset($tab['SUBTABS'])) {
+        $acl = $this->getAttributeCategory($config->data['TABS'][$tab['SUBTABS']], $attribute);
+        if ($acl !== FALSE) {
+          return $acl;
+        }
+      }
     }
     return FALSE;
   }
diff --git a/plugins/config/class_pluginsConfigInLdap.inc b/plugins/config/class_pluginsConfigInLdap.inc
index 941fae92f..c797cf0b7 100644
--- a/plugins/config/class_pluginsConfigInLdap.inc
+++ b/plugins/config/class_pluginsConfigInLdap.inc
@@ -1,7 +1,7 @@
 <?php
 /*
   This code is part of FusionDirectory (http://www.fusiondirectory.org/)
-  Copyright (C) 2012-2016  FusionDirectory
+  Copyright (C) 2012-2018  FusionDirectory
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -22,7 +22,6 @@ class pluginsConfigInLdap extends multiPlugin
 {
   var $tabClass = 'SMALLCONFIGTABS';
 
-  /* Return plugin informations for acl handling */
   static function plInfo()
   {
     return array(
@@ -30,9 +29,9 @@ class pluginsConfigInLdap extends multiPlugin
       'plDescription' => _('Configuration for plugins'),
       'plPriority'    => 20,
       'plObjectType'  => array('configuration'),
+      'plSubTabs'     => 'smallConfig',
 
       'plProvidedAcls'  => array()
     );
   }
 }
-?>
-- 
GitLab