From d07ca592c6023d801772e0aec75fe8ee78965860 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=B4me=20Chilliet?= <come@opensides.be>
Date: Wed, 25 Jan 2017 13:27:02 +0100
Subject: [PATCH] Fixes #5357 Do not remove tabs when applying templates to
 existing objects

Conflicts:
	include/simpleplugin/class_simplePlugin.inc
---
 include/class_baseSelector.inc              | 3 +--
 include/class_plugin.inc                    | 2 +-
 include/class_template.inc                  | 5 +++++
 include/simpleplugin/class_simplePlugin.inc | 6 ++++++
 4 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/include/class_baseSelector.inc b/include/class_baseSelector.inc
index 9c2d58518..4727f62bb 100644
--- a/include/class_baseSelector.inc
+++ b/include/class_baseSelector.inc
@@ -142,7 +142,7 @@ class baseSelector {
   {
     global $config;
 
-    if (!isset($this->base) || ($this->base == "")) {
+    if (!isset($this->base) || ($this->base == '')) {
       $this->lastState = FALSE;
       return FALSE;
     }
@@ -179,7 +179,6 @@ class baseSelector {
           }
         }
       }
-
     }
 
     /* Skip if there's no change */
diff --git a/include/class_plugin.inc b/include/class_plugin.inc
index 408497a3f..c73d9cc0b 100644
--- a/include/class_plugin.inc
+++ b/include/class_plugin.inc
@@ -459,7 +459,7 @@ class plugin
     $is_new = empty($oc);
 
     /* Load (minimum) attributes, add missing ones */
-    $this->attrs['objectClass'] = array_merge_unique($oc, $this->objectclasses);
+    $this->attrs['objectClass'] = $this->mergeObjectClasses($oc);
 
     /* Copy standard attributes */
     foreach ($this->attributes as $val) {
diff --git a/include/class_template.inc b/include/class_template.inc
index ebb73833d..08c5496c4 100644
--- a/include/class_template.inc
+++ b/include/class_template.inc
@@ -191,6 +191,11 @@ class template
   {
     if ($targetdn !== NULL) {
       $this->tabObject = objects::open($targetdn, $this->type);
+      foreach ($this->tabObject->by_object as $class => &$plugin) {
+        if ($plugin->is_account || $plugin->ignore_account) {
+          $this->attrs['objectClass'] = $plugin->mergeObjectClasses($this->attrs['objectClass']);
+        }
+      }
     } elseif ($this->applied) {
       trigger_error('Templates can’t be applied twice without calling reset before');
       return;
diff --git a/include/simpleplugin/class_simplePlugin.inc b/include/simpleplugin/class_simplePlugin.inc
index 34a2a0511..c4e88e2e0 100644
--- a/include/simpleplugin/class_simplePlugin.inc
+++ b/include/simpleplugin/class_simplePlugin.inc
@@ -657,6 +657,12 @@ class simplePlugin extends plugin
     $this->post_save();
   }
 
+  /* Used by prepare_save and template::apply */
+  public function mergeObjectClasses(array $oc)
+  {
+    return array_merge_unique($oc, $this->objectclasses);
+  }
+
   protected function prepare_save ()
   {
     /* Call parents save to prepare $this->attrs */
-- 
GitLab