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;