diff --git a/contrib/openldap/core-fd.schema b/contrib/openldap/core-fd.schema index 2d4f974f7ef9456136c3bad92234270f612911f7..af6f433b1057f1fe1744573f6a2f3d785cdcbb5d 100644 --- a/contrib/openldap/core-fd.schema +++ b/contrib/openldap/core-fd.schema @@ -119,10 +119,6 @@ objectclass ( 1.3.6.1.4.1.10098.1.2.1.19.6 NAME 'gosaAccount' SUP top AUXILIARY gosaDefaultLanguage $ academicTitle $ personalTitle $ dateOfBirth $ sambaBadPasswordCount $ sambaBadPasswordTime $ gender $ gosaLoginRestriction )) -objectclass ( 1.3.6.1.4.1.10098.1.2.1.19.11 NAME 'gosaUserTemplate' SUP top AUXILIARY - DESC 'Class for GOsa User Templates (v2.6.1)' - MUST ( cn )) - objectclass ( 1.3.6.1.4.1.10098.1.2.1.19.12 NAME 'gosaGroupOfNames' DESC 'GOsa object grouping (v2.6.1)' SUP top STRUCTURAL diff --git a/contrib/openldap/template-fd.schema b/contrib/openldap/template-fd.schema index 53184227ea27449ae3c7d72c4772b6b921edd408..828ae9a9ffc69f253b70aad374866cea91d1a028 100644 --- a/contrib/openldap/template-fd.schema +++ b/contrib/openldap/template-fd.schema @@ -3,13 +3,13 @@ ## # Attributes -attributetype ( 1.3.6.1.4.1.38414.ID.1.1 NAME 'fdTemplateField' +attributetype ( 1.3.6.1.4.1.38414.38.1.1 NAME 'fdTemplateField' DESC 'FusionDirectory - template field' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26) # Objectclasses -objectclass (1.3.6.1.4.1.38414.ID.2.1 NAME 'fdTemplate' +objectclass (1.3.6.1.4.1.38414.38.2.1 NAME 'fdTemplate' DESC 'FusionDirectory - template object' MUST ( cn ) MAY ( fdTemplateField ) ) diff --git a/include/class_plugin.inc b/include/class_plugin.inc index b9ebb5fd64c98cab01d2621250e093521e38dd88..aa4a5c138587d210ce7eb6f61fa44bd1ac850b4d 100644 --- a/include/class_plugin.inc +++ b/include/class_plugin.inc @@ -1,5 +1,4 @@ <?php - /* This code is part of FusionDirectory (http://www.fusiondirectory.org/) Copyright (C) 2003-2010 Cajus Pollmeier @@ -81,6 +80,7 @@ class plugin \sa plugin::save() plugin::execute() */ var $is_template = FALSE; + var $template_cn = FALSE; var $ignore_account = FALSE; var $is_modified = FALSE; @@ -188,8 +188,7 @@ class plugin if (isset($this->attrs['objectClass'])) { if (in_array_ics ("fdTemplate", $this->attrs['objectClass'])) { @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, "found", "Template check"); - $this->is_template = TRUE; - $this->attrs = self::prepareTemplateAttrs($this->attrs); + $this->loadTemplateAttrs($this->attrs); } } @@ -264,9 +263,14 @@ class plugin } } - static function prepareTemplateAttrs($template_attrs) + protected function loadTemplateAttrs($template_attrs) { + $this->is_template = TRUE; + if ($this->mainTab) { + $this->template_cn = $template_attrs['cn'][0]; + } /* Translate template attrs into $attrs as if taken from LDAP */ + unset($template_attrs['fdTemplateField']['count']); sort($template_attrs['fdTemplateField']); $attrs = array(); foreach ($template_attrs['fdTemplateField'] as $field) { @@ -279,22 +283,52 @@ class plugin $attrs[$m[1]]['count'] = 1; } } - return $attrs; + $this->attrs = $attrs; } protected function saveTemplateAttrs() { - $template_attrs = array('objectClass' => 'fdTemplate', 'fdTemplateField' => array()); - /* Translate $attrs into template attrs */ - foreach ($this->attrs as $key => $value) { - if (empty($value)) { - continue; + $ldap = $this->config->get_ldap_link(); + $ldap->cat($this->dn); + $template_attrs = $ldap->fetch(); + if (!$template_attrs) { + if (!$this->mainTab) { + trigger_error('It seems main tab has not been saved.'); } - unset($value['count']); - foreach ($value as $v) { - $template_attrs['fdTemplateField'][] = $key.':'.$v; + $template_attrs = array( + 'objectClass' => array('fdTemplate'), + 'fdTemplateField' => array() + ); + } + if ($this->mainTab) { + $template_attrs['cn'] = $this->template_cn; + } + unset($template_attrs['fdTemplateField']['count']); + /* First remove all concerned values */ + foreach ($template_attrs['fdTemplateField'] as $key => $value) { + preg_match('/^([^:]+):(.*)$/', $value, $m); + if (isset($this->attrs[$m[1]])) { + unset($template_attrs['fdTemplateField'][$key]); + } + } + /* Then insert non-empty values */ + foreach ($this->attrs as $key => $value) { + if (is_array($value)) { + foreach ($value as $v) { + if ($value == "") { + continue; + } + $template_attrs['fdTemplateField'][] = $key.':'.$v; + } + } else { + if ($value == "") { + continue; + } + $template_attrs['fdTemplateField'][] = $key.':'.$value; } } + sort($template_attrs['fdTemplateField']); + print_r($template_attrs); return $template_attrs; } diff --git a/include/class_tabs.inc b/include/class_tabs.inc index 88031056f1f7004e99b0ca37e9f1d07d9910abd1..3d66cd848591b6dfd1b4f29a0d53db3e48252563 100644 --- a/include/class_tabs.inc +++ b/include/class_tabs.inc @@ -312,7 +312,7 @@ class tabs /* Check all plugins */ foreach ($this->by_object as $key => &$obj) { - if ($obj->is_account || $obj->ignore_account) { + if (($obj->is_account || $obj->ignore_account) && (!$obj->is_template)) { @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, $key, "Checking"); $msg = $obj->check(); @@ -420,5 +420,15 @@ class tabs } unset($obj); } + + function setTemplateMode($cn) + { + $this->getBaseObject()->template_cn = $cn; + + foreach ($this->by_object as &$obj) { + $obj->is_template = TRUE; + } + unset($obj); + } } ?> diff --git a/plugins/admin/groups/class_group.inc b/plugins/admin/groups/class_group.inc index c6534c31af33247f4d26b4aafb6dd2208b820e96..9e81bfdea497c5ff048da85e5bec9f8d5f5d03bd 100644 --- a/plugins/admin/groups/class_group.inc +++ b/plugins/admin/groups/class_group.inc @@ -606,7 +606,7 @@ class group extends plugin /* Create display list of users matching regex & filter */ $this->displayUsers = array(); - $filter = "(&(objectClass=gosaAccount)(!(objectClass=gosaUserTemplate))(!(uid=*$))(|(uid=".$regex.")(sn=".$regex.")(givenName=".$regex.")))"; + $filter = "(&(objectClass=gosaAccount)(!(uid=*$))(|(uid=".$regex.")(sn=".$regex.")(givenName=".$regex.")))"; /* Search in current tree or within subtrees depending on the checkbox from filter section */ if($gufilter['SubSearchGroup']){ diff --git a/plugins/admin/groups/userGroupSelect/selectUserGroup-filter.xml b/plugins/admin/groups/userGroupSelect/selectUserGroup-filter.xml index c0442846e7c70be9e89a9068284b20cf9673d29c..76f99f7c93b97f210f8e4a8589a2f0fa99a5f951 100644 --- a/plugins/admin/groups/userGroupSelect/selectUserGroup-filter.xml +++ b/plugins/admin/groups/userGroupSelect/selectUserGroup-filter.xml @@ -45,7 +45,7 @@ <type>checkbox</type> <tag>USER</tag> <default>true</default> - <set>(&(objectClass=posixAccount)(!(objectClass=gosaUserTemplate)))</set> + <set>(objectClass=posixAccount)</set> <unset></unset> </element> diff --git a/plugins/admin/ogroups/class_ogroup.inc b/plugins/admin/ogroups/class_ogroup.inc index b0ebe27c841c3445cd2381039b0eb140b52c20f0..506ac95cb6e0c23d28183bde36d1098a0e8b3a68 100644 --- a/plugins/admin/ogroups/class_ogroup.inc +++ b/plugins/admin/ogroups/class_ogroup.inc @@ -673,7 +673,7 @@ class ogroup extends plugin $type= "I"; foreach(array( - "Y" => "gosaUserTemplate", + "Y" => "fdTemplate", "U" => "gosaAccount", "G" => "posixGroup", "A" => "gosaApplication", diff --git a/plugins/admin/ogroups/objectSelect/selectObject-filter.xml b/plugins/admin/ogroups/objectSelect/selectObject-filter.xml index 5cc3f205a53f615a4bfa08a179682a0b3c163fd1..5a12e616efae9a4cca8f3944751a7ff00bbd5907 100644 --- a/plugins/admin/ogroups/objectSelect/selectObject-filter.xml +++ b/plugins/admin/ogroups/objectSelect/selectObject-filter.xml @@ -61,7 +61,7 @@ <type>checkbox</type> <tag>USER</tag> <default></default> - <set>(&(objectClass=gosaAccount)(!(objectClass=gosaUserTemplate)))</set> + <set>(objectClass=gosaAccount)</set> <unset></unset> </element> @@ -88,7 +88,7 @@ <unset></unset> <set>(objectClass=gosaApplication)</set> </element> - + <element> <type>checkbox</type> <tag>SERVER</tag> diff --git a/plugins/admin/users/class_userManagement.inc b/plugins/admin/users/class_userManagement.inc index d9935cf2190a58bcc94625d5e266c668689bc210..9d8cffe85ee008d73041551a11f0e540bcee221b 100644 --- a/plugins/admin/users/class_userManagement.inc +++ b/plugins/admin/users/class_userManagement.inc @@ -176,10 +176,10 @@ class userManagement extends management /*! \brief Intiates template creation. */ - function newTemplate($action,$entry) + function newTemplate($action, $entry) { $this->newEntry(); - $this->tabObject->set_template_mode (); + $this->tabObject->setTemplateMode('template_tmp'); // FIXME : this needs to be chosen by the user } @@ -766,7 +766,7 @@ class userManagement extends management if (preg_match("/c/",$acl)) { // Search all templates from the current dn. $ldap->cd(get_people_ou().$value); - $ldap->search("(objectClass=gosaUserTemplate)", array('cn')); + $ldap->search("(&(fdTemplateField=objectClass:person)(objectClass=fdTemplate))", array('cn')); if ($ldap->count() != 0) { while ($attrs = $ldap->fetch()) { $templates[$ldap->getDN()] = $attrs['cn'][0]." - ".LDAP::fix($key); diff --git a/plugins/admin/users/user-filter.xml b/plugins/admin/users/user-filter.xml index 5af0b0c8b20c922e84c659632f617743fb35aea1..02aaaf5edef82abbca18db98cad2f0c970349788 100644 --- a/plugins/admin/users/user-filter.xml +++ b/plugins/admin/users/user-filter.xml @@ -10,7 +10,7 @@ <search> <query> <backend>LDAP</backend> - <filter>(&(objectClass=gosaAccount)$TEMPLATES$NAME(|$FUNCTIONAL$SAMBA$POSIX$MAIL))</filter> + <filter>(&$NAME(|(&(objectClass=gosaAccount)(|$FUNCTIONAL$SAMBA$POSIX$MAIL))$TEMPLATES))</filter> <attribute>dn</attribute> <attribute>objectClass</attribute> <attribute>givenName</attribute> @@ -44,8 +44,8 @@ <type>checkbox</type> <tag>TEMPLATES</tag> <default></default> - <unset>(!(objectClass=gosaUserTemplate))</unset> - <set></set> + <unset></unset> + <set>(objectClass=fdTemplate)</set> </element> <element> diff --git a/plugins/admin/users/user-list.xml b/plugins/admin/users/user-list.xml index 1e4b230bcb525a797ea86ad5d143e7c21db28309..6069f02ef1f6cca67908d9c4dcc8b22eb52df34c 100644 --- a/plugins/admin/users/user-list.xml +++ b/plugins/admin/users/user-list.xml @@ -13,7 +13,7 @@ <objectType> <label>Template</label> - <objectClass>gosaUserTemplate</objectClass> + <objectClass>fdTemplate</objectClass> <category>users</category> <class>user</class> <image>plugins/users/images/select_template.png</image> @@ -188,13 +188,13 @@ <name>newfromtpl</name> <type>entry</type> <image>images/lists/new.png</image> - <objectclass>gosaUserTemplate</objectclass> + <objectclass>fdTemplate</objectclass> <label>New user from template</label> </action> <action> <name>cp</name> - <objectclass>!gosaUserTemplate</objectclass> + <objectclass>!fdTemplate</objectclass> <type>copypaste</type> </action> @@ -209,7 +209,7 @@ <action> <name>lock</name> <type>entry</type> - <objectclass>!gosaUserTemplate</objectclass> + <objectclass>!fdTemplate</objectclass> <image>%{filter:lockImage(userPassword)}</image> <acl>users/password[w]</acl> <label>%{filter:lockLabel(userPassword)}</label> @@ -218,7 +218,7 @@ <action> <name>password</name> <type>entry</type> - <objectclass>!gosaUserTemplate</objectclass> + <objectclass>!fdTemplate</objectclass> <acl>users/password[w]</acl> <image>plugins/users/images/list_password.png</image> <label>Change password</label> @@ -227,7 +227,7 @@ <action> <name>snapshot</name> <type>snapshot</type> - <objectclass>!gosaUserTemplate</objectclass> + <objectclass>!fdTemplate</objectclass> </action> <action> diff --git a/plugins/personal/generic/class_user.inc b/plugins/personal/generic/class_user.inc index fcd6387fa3c284fa0ab1d6e0254ca44d3dfb0f99..6fb86d15919cbea650bb7c880c00e67f9f02d8f5 100644 --- a/plugins/personal/generic/class_user.inc +++ b/plugins/personal/generic/class_user.inc @@ -349,6 +349,11 @@ class user extends simplePlugin function compute_dn() { + if ($this->is_template) { + $dn = 'cn='.$this->template_cn.',ou=templates,'.get_people_ou().$this->base; + return $dn; + } + $this->update_cn(); // Handle accountRDN if filled $attribute = ''; @@ -384,7 +389,7 @@ class user extends simplePlugin } /* Remove ACL dependencies too */ - if ($this->dn != $this->orig_dn && $this->orig_dn != 'new') { + if (($this->dn != $this->orig_dn) && ($this->orig_dn != 'new') && (!$this->is_template)) { $tmp = new acl($this->config, $this->dn, $this); $tmp->update_acl_membership($this->orig_dn, $this->dn); } diff --git a/plugins/personal/posix/class_posixAccount.inc b/plugins/personal/posix/class_posixAccount.inc index 4e1f6b448edbfead4963adeb254ec2f4e9815b66..6c3ac637f534dc216f94ba1e5a96be957b75f73f 100644 --- a/plugins/personal/posix/class_posixAccount.inc +++ b/plugins/personal/posix/class_posixAccount.inc @@ -603,13 +603,13 @@ class posixAccount extends simplePlugin } } - $ldap->cd($this->config->current['BASE']); - $ldap->search("(&(objectClass=gosaUserTemplate)(uid=$template)(accessTo=*))", array("cn","accessTo")); - while ($attr = $ldap->fetch()) { - $tmp = $attr['accessTo']; - unset($tmp['count']); - $this->accessTo = $tmp; - } + //~ $ldap->cd($this->config->current['BASE']); + //~ $ldap->search("(&(objectClass=gosaUserTemplate)(uid=$template)(accessTo=*))", array("cn","accessTo")); + //~ while ($attr = $ldap->fetch()) { + //~ $tmp = $attr['accessTo']; + //~ unset($tmp['count']); + //~ $this->accessTo = $tmp; + //~ } } }