diff --git a/lam/docs/devel/mod_general.htm b/lam/docs/devel/mod_general.htm
index 3e108b68..c28cac1c 100644
--- a/lam/docs/devel/mod_general.htm
+++ b/lam/docs/devel/mod_general.htm
@@ -229,9 +229,52 @@ is set dynamically
-
+6. Managed object classes
+You can tell LAM what object classes are managed by your module.
+LAM will then check the spelling of the objectClass attributes and
+correct it automatically. This is useful if other applications (e.g.
+smbldap-tools) also create accounts and the spelling is differnt.
+
+Example:
+
+The ieee802Device module
+manages one object class.
+
+
+
+
+ /**
+ * Returns meta data that is interpreted by parent
+class
+ *
+ * @return array array with meta data
+ */
+ function
+get_metaData() {
+ $return = array();
+ // manages host accounts
+
+ $return["account_types"] = array("host");
+ // alias name
+ $return["alias"] = _("MAC
+address");
+ // module dependencies
+
+ $return['dependencies'] = array('depends' =>
+array('account'), 'conflicts' => array());
+ // managed object classes
+
+ $return['objectClasses'] = array('ieee802Device');
+ return $return;
+ }
+ |
+
+
+
diff --git a/lam/docs/devel/modules-specification.htm b/lam/docs/devel/modules-specification.htm
index 64d83dd4..24777678 100644
--- a/lam/docs/devel/modules-specification.htm
+++ b/lam/docs/devel/modules-specification.htm
@@ -123,7 +123,27 @@ The resulting LDAP filter will look like this:
style="font-style: italic;">return "('or' =>
'(objectClass=posixAccount)', 'and' => '(!(uid=*$))')"
-2.1.5. get_RDNAttributes*
+2.1.5. getManagedObjectClasses*
+
+
+
+
+ function getManagedObjectClasses()
+ |
+
+
+
+
+Returns an array of object class names which are managed by this module.
+
+This is used to fix spelling errors in LDAP-Entries (e.g. if
+"posixACCOUNT" is read instead of "posixAccount" from LDAP).
+
+Example: return "('posixAccount')"
+
+2.1.6. get_RDNAttributes*
@@ -147,8 +167,8 @@ for the RDN selection.
style="font-style: italic;">return "('uid' =>
'normal', 'cn' => 'low')"
-
-2.1.6. get_dependencies*
+
+2.1.7. get_dependencies*
@@ -178,7 +198,7 @@ your module depends on one of these modules.
=> array("exim"));
-2.1.7. get_metaData()
+2.1.8. get_metaData()
@@ -195,7 +215,7 @@ Returns an hash array including meta data for the baseModule.
Example: return array("is_base" =>
true);
-2.1.8. get_configOptions()*
+2.1.9. get_configOptions()*
@@ -224,7 +244,7 @@ as keywords to load and save settings. We recommend to use the module
name as prefix for them (e.g. posixAccount_homeDirectory) to avoid
naming confilcts.
-2.1.9. get_configDescriptions()*
+2.1.10. get_configDescriptions()*
@@ -249,7 +269,7 @@ array with this format:
'descriptions' => array('option1'
=> 'description1', ...))
-2.1.10. check_configOptions*
+2.1.11. check_configOptions*
@@ -277,7 +297,7 @@ If no errors occured the function returns an empty array.
-2.1.11. get_scope()
+2.1.12. get_scope()
@@ -294,7 +314,7 @@ Returns the account type (user/group/host) of this module object.
This function is provided by the
baseModule and should not be overwritten.
-2.1.12. get_uploadColumns*
+2.1.13. get_uploadColumns*
@@ -339,7 +359,7 @@ all values of this column must be different values
-2.1.13. get_uploadPreDepends*
+2.1.14. get_uploadPreDepends*
@@ -355,7 +375,7 @@ Returns a list of module names which must be processed before this
module at builing accounts.
The named modules may not be active, LAM will check this automatically.
-2.1.14. build_uploadAccounts
+2.1.15. build_uploadAccounts
@@ -382,7 +402,7 @@ format is the same as used for ldap_add().
Returns an array which contains sub arrays to generate StatusMessages
if any errors occured.
-2.1.15. do_uploadPostActions
+2.1.16. do_uploadPostActions
@@ -428,7 +448,7 @@ array() // List of arrays which are used to generate
StatusMessages
)
-2.1.16. get_profileOptions*
+2.1.17. get_profileOptions*
@@ -452,7 +472,7 @@ as keywords to load and save profiles. We recommend to use the module
name as prefix for them (e.g. posixAccount_homeDirectory) to avoid
naming confilcts.
-2.1.17. check_profileOptions*
+2.1.18. check_profileOptions*
@@ -476,7 +496,7 @@ head, 2 => message text, 3 => additional variables).
If no errors occured the function returns an empty array.
-2.1.18. load_profile*
+2.1.19. load_profile*
@@ -934,9 +954,9 @@ of string. This is the list of pre selected elements, must contain
values that are also in options.
descriptiveOptions:
Boolean value, if set to true then all elements in options
-must be arrays themselves (array(value, description)) (default: false)
+must be arrays themselves (array(value,
+ description)) (default:
+false)
size: The size of the
select field, if set to 1 a dropdown box will be displayed.
@@ -1247,7 +1267,15 @@ array("user", "host")
'objectClass=posixAccount', 'and' => '(!(uid=*$))')
-6.4 get_RDNAttributes()
+6.4 getManagedObjectClasses()
+ "objectClasses" => array
+
+ Example: array('posixAccount')
+
+
+
+6.5 get_RDNAttributes()
"RDN" => array
Example:
-6.5 get_dependencies()
+6.6 get_dependencies()
"dependencies" => array
@@ -1268,7 +1296,7 @@ array("user", "host")
=> array("exim"))
-6.6 get_profileOptions()
+6.7 get_profileOptions()
"profile_options" => array
@@ -1277,7 +1305,7 @@ array("user", "host")
return value of get_profileOptions().
-6.7 check_profileOptions()
+6.8 check_profileOptions()
"profile_checks" => array
@@ -1352,7 +1380,7 @@ head, 2 => message text, 3 => additional variables)
-6.8 load_profile()
+6.9 load_profile()
"profile_mappings" => array('profile_identifier1'
=> 'LDAP_attribute1', 'profile_identifier2' => 'LDAP_attribute2')
@@ -1361,7 +1389,7 @@ head, 2 => message text, 3 => additional variables)
$this->attributes.
-6.9 get_configOptions()
+6.10 get_configOptions()
"config_options" => array('user' => array,
'host' => array, 'all' => array)
@@ -1377,7 +1405,7 @@ the
return value of get_configOptions().
-6.10 get_configDescriptions()
+6.11 get_configDescriptions()
"config_descriptions" => array
@@ -1386,7 +1414,7 @@ return value of get_configOptions().
return value of get_configDescriptions().
-6.11 check_configOptions()
+6.12 check_configOptions()
"config_checks" => array('user' => array,
'host' => 'array', 'all' => array)
@@ -1400,14 +1428,14 @@ the other values only if they are inside the
-6.12 get_uploadColumns()
+6.13 get_uploadColumns()
"upload_columns" => array()
Syntax for array is the same as for
the
return value of get_uploadColumns().
-6.13 get_uploadPreDepends()
+6.14 get_uploadPreDepends()
"upload_preDepends" => array()
Syntax for array is the same as for
diff --git a/lam/lib/baseModule.inc b/lam/lib/baseModule.inc
index cb4ada58..0a283339 100644
--- a/lam/lib/baseModule.inc
+++ b/lam/lib/baseModule.inc
@@ -664,6 +664,17 @@ class baseModule {
function display_html_delete(&$post) {
return 0;
}
+
+ /**
+ * Returns a list of managed object classes for this module.
+ * This is used to fix incorrect spelled object class names.
+ *
+ * @return array list of object classes
+ */
+ function getManagedObjectClasses() {
+ if (isset($this->meta['objectClasses']) && is_array($this->meta['objectClasses'])) return $this->meta['objectClasses'];
+ else return array();
+ }
}
diff --git a/lam/lib/modules.inc b/lam/lib/modules.inc
index 05117a0c..f7d962eb 100644
--- a/lam/lib/modules.inc
+++ b/lam/lib/modules.inc
@@ -1376,6 +1376,8 @@ class accountContainer {
$attrNames = array_keys($attr);
for ($i = 0; $i < sizeof($attrNames); $i++) unset($attr[$attrNames[$i]]['count']);
unset($attr['count']);
+ // fix spelling errors
+ $attr = $this->fixLDAPAttributes($attr, $modules);
// get binary attributes
$binaryAttr = array('jpegPhoto');
for ($i = 0; $i < sizeof($binaryAttr); $i++) {
@@ -1399,7 +1401,50 @@ class accountContainer {
// sort module buttons
$this->sortModules();
return 0;
+ }
+
+ /**
+ * Fixes spelling errors in the attribute names.
+ *
+ * @param array $attributes LDAP attributes
+ * @param array $modules list of active modules
+ * @return array fixed attributes
+ */
+ function fixLDAPAttributes($attributes, $modules) {
+ if (!is_array($attributes)) return $attributes;
+ $keys = array_keys($attributes);
+ // get correct object class names
+ $objectClasses = array();
+ foreach ($modules as $module) {
+ $moduleObj = new $module($this->type);
+ $objectClasses = array_merge($objectClasses, $moduleObj->getManagedObjectClasses());
}
+ // check object classes
+ for ($i = 0; $i < sizeof($keys); $i++) {
+ if (strtolower($keys[$i]) == 'objectclass') {
+ // fix object class attribute
+ if ($keys[$i] != 'objectClass') {
+ $temp = $attributes[$keys[$i]];
+ unset($attributes[$keys[$i]]);
+ $attributes['objectClass'] = $temp;
+ }
+ // fix object classes
+ for ($attrClass = 0; $attrClass < sizeof($attributes['objectClass']); $attrClass++) {
+ for ($modClass = 0; $modClass < sizeof($objectClasses); $modClass++) {
+ if (strtolower($attributes['objectClass'][$attrClass]) == strtolower($objectClasses[$modClass])) {
+ if ($attributes['objectClass'][$attrClass] != $objectClasses[$modClass]) {
+ unset($attributes['objectClass'][$attrClass]);
+ $attributes['objectClass'][] = $objectClasses[$modClass];
+ }
+ break;
+ }
+ }
+ }
+ break;
+ }
+ }
+ return $attributes;
+ }
/**
* This function will prepare the object for a new account.
diff --git a/lam/lib/modules/account.inc b/lam/lib/modules/account.inc
index 34bb7489..6a640f34 100644
--- a/lam/lib/modules/account.inc
+++ b/lam/lib/modules/account.inc
@@ -59,6 +59,8 @@ class account extends baseModule {
$return["RDN"] = array("uid" => "low");
// module dependencies
$return['dependencies'] = array('depends' => array(), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array('account');
// available PDF fields
$return['PDF_fields'] = array(
'description'
diff --git a/lam/lib/modules/ieee802device.inc b/lam/lib/modules/ieee802device.inc
index 902d5265..42582689 100644
--- a/lam/lib/modules/ieee802device.inc
+++ b/lam/lib/modules/ieee802device.inc
@@ -47,6 +47,8 @@ class ieee802Device extends baseModule {
$return["alias"] = _("MAC address");
// module dependencies
$return['dependencies'] = array('depends' => array(), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array('ieee802Device');
// help Entries
$return['help'] = array(
'mac' => array(
diff --git a/lam/lib/modules/inetLocalMailRecipient.inc b/lam/lib/modules/inetLocalMailRecipient.inc
index d96cbf29..be647d80 100644
--- a/lam/lib/modules/inetLocalMailRecipient.inc
+++ b/lam/lib/modules/inetLocalMailRecipient.inc
@@ -47,6 +47,8 @@ class inetLocalMailRecipient extends baseModule {
$return["alias"] = _("Mail routing");
// module dependencies
$return['dependencies'] = array('depends' => array(), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array('inetLocalMailRecipient');
// help Entries
$return['help'] = array(
'routingAdr' => array(
diff --git a/lam/lib/modules/inetOrgPerson.inc b/lam/lib/modules/inetOrgPerson.inc
index ce9288e1..13170372 100644
--- a/lam/lib/modules/inetOrgPerson.inc
+++ b/lam/lib/modules/inetOrgPerson.inc
@@ -96,6 +96,8 @@ class inetOrgPerson extends baseModule {
$return["ldap_filter"] = array('or' => "(objectClass=inetOrgPerson)");
// module dependencies
$return['dependencies'] = array('depends' => array(), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array('inetOrgPerson');
// profile elements
$return['profile_options'] = array(
array(
diff --git a/lam/lib/modules/kolabUser.inc b/lam/lib/modules/kolabUser.inc
index 12e16213..35a1dfa4 100644
--- a/lam/lib/modules/kolabUser.inc
+++ b/lam/lib/modules/kolabUser.inc
@@ -73,6 +73,8 @@ class kolabUser extends baseModule {
$return['dependencies'] = array('depends' => array('inetOrgPerson'), 'conflicts' => array());
// LDAP filter
$return["ldap_filter"] = array('or' => "(objectClass=kolabInetOrgPerson)");
+ // managed object classes
+ $return['objectClasses'] = array('kolabInetOrgPerson');
// profile options
$return['profile_options'] = array(
array(
@@ -242,7 +244,6 @@ class kolabUser extends baseModule {
*/
function load_attributes($attr) {
$this->attributes['objectClass'] = array();
- $this->attributes['macAddress'] = array();
$this->orig['objectClass'] = array();
$this->orig['kolabInvitationPolicy'] = array();
// load Kolab attributes
diff --git a/lam/lib/modules/ldapPublicKey.inc b/lam/lib/modules/ldapPublicKey.inc
index c04a4bb8..be5b366b 100644
--- a/lam/lib/modules/ldapPublicKey.inc
+++ b/lam/lib/modules/ldapPublicKey.inc
@@ -48,6 +48,8 @@ class ldapPublicKey extends baseModule {
$return["alias"] = _("SSH public key");
// module dependencies
$return['dependencies'] = array('depends' => array(), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array('ldapPublicKey');
// help Entries
$return['help'] = array(
'key' => array(
diff --git a/lam/lib/modules/nisMailAlias.inc b/lam/lib/modules/nisMailAlias.inc
index c25ba468..f89ac749 100644
--- a/lam/lib/modules/nisMailAlias.inc
+++ b/lam/lib/modules/nisMailAlias.inc
@@ -53,6 +53,8 @@ class nisMailAlias extends baseModule {
$return["RDN"] = array("cn" => "normal");
// module dependencies
$return['dependencies'] = array('depends' => array(), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array('nisMailAlias');
// help Entries
$return['help'] = array(
'alias' => array(
diff --git a/lam/lib/modules/posixAccount.inc b/lam/lib/modules/posixAccount.inc
index 0b814238..bba40c9a 100644
--- a/lam/lib/modules/posixAccount.inc
+++ b/lam/lib/modules/posixAccount.inc
@@ -123,6 +123,8 @@ class posixAccount extends baseModule {
$return["alias"] = _("Unix");
// RDN attributes
$return["RDN"] = array("uid" => "normal", "cn" => "low");
+ // managed object classes
+ $return['objectClasses'] = array('posixAccount');
// profile checks
$return['profile_checks']['posixAccount_homeDirectory'] = array('type' => 'ext_preg', 'regex' => 'homeDirectory',
'error_message' => $this->messages['homeDirectory'][0]);
diff --git a/lam/lib/modules/posixGroup.inc b/lam/lib/modules/posixGroup.inc
index f56060e3..fd3c753c 100644
--- a/lam/lib/modules/posixGroup.inc
+++ b/lam/lib/modules/posixGroup.inc
@@ -307,6 +307,8 @@ class posixGroup extends baseModule {
$return["RDN"] = array("cn" => "normal");
// module dependencies
$return['dependencies'] = array('depends' => array(), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array('posixGroup');
// configuration options
$return['config_options']['group'] = array(
array(
diff --git a/lam/lib/modules/sambaAccount.inc b/lam/lib/modules/sambaAccount.inc
index e33d15e9..a7dc75fb 100644
--- a/lam/lib/modules/sambaAccount.inc
+++ b/lam/lib/modules/sambaAccount.inc
@@ -105,6 +105,8 @@ class sambaAccount extends baseModule {
$return["alias"] = _('Samba 2');
// module dependencies
$return['dependencies'] = array('depends' => array('posixAccount'), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array('sambaAccount');
// profile options
if ($this->get_scope() == 'user') {
// set Unix password for Samba
diff --git a/lam/lib/modules/sambaDomain.inc b/lam/lib/modules/sambaDomain.inc
index 203a9001..60dfee0b 100644
--- a/lam/lib/modules/sambaDomain.inc
+++ b/lam/lib/modules/sambaDomain.inc
@@ -53,6 +53,8 @@ class sambaDomain extends baseModule {
$return["ldap_filter"] = array('or' => "(objectClass=sambaDomain)");
// module dependencies
$return['dependencies'] = array('depends' => array(), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array('sambaDomain');
// help Entries
$return['help'] = array(
'domainName' => array(
diff --git a/lam/lib/modules/sambaGroupMapping.inc b/lam/lib/modules/sambaGroupMapping.inc
index b5ecb2a5..265a3e71 100644
--- a/lam/lib/modules/sambaGroupMapping.inc
+++ b/lam/lib/modules/sambaGroupMapping.inc
@@ -232,6 +232,8 @@ class sambaGroupMapping extends baseModule {
$return["alias"] = _('Samba 3');
// module dependencies
$return['dependencies'] = array('depends' => array('posixGroup'), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array('sambaGroupMapping');
// available PDF fields
$return['PDF_fields'] = array(
'gidNumber',
diff --git a/lam/lib/modules/sambaSamAccount.inc b/lam/lib/modules/sambaSamAccount.inc
index 7975da0a..9c8d08b6 100644
--- a/lam/lib/modules/sambaSamAccount.inc
+++ b/lam/lib/modules/sambaSamAccount.inc
@@ -124,6 +124,8 @@ class sambaSamAccount extends baseModule {
$return["RDN"] = array("sambaSID" => "low");
// module dependencies
$return['dependencies'] = array('depends' => array('posixAccount'), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array('sambaSamAccount');
// profile checks
$return['profile_checks']['sambaSamAccount_smbhome'] = array(
'type' => 'ext_preg',
diff --git a/lam/lib/modules/shadowAccount.inc b/lam/lib/modules/shadowAccount.inc
index 02d30d76..8d70a3a7 100644
--- a/lam/lib/modules/shadowAccount.inc
+++ b/lam/lib/modules/shadowAccount.inc
@@ -68,6 +68,8 @@ class shadowAccount extends baseModule {
$return["alias"] = _('Shadow');
// module dependencies
$return['dependencies'] = array('depends' => array('posixAccount'), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array('shadowAccount');
// lists for expiration date
$day = array(); $mon = array(); $year = array();
for ( $i=1; $i<=31; $i++ ) $day[] = $i;