diff --git a/lam/docs/devel/upgrade.htm b/lam/docs/devel/upgrade.htm index 215a1f78..009b7c98 100644 --- a/lam/docs/devel/upgrade.htm +++ b/lam/docs/devel/upgrade.htm @@ -19,6 +19,7 @@ + @@ -40,7 +41,10 @@ This is a list of API changes for all LAM releases.
-

4.5 -> 4.6

The valid account types for each module must now +

4.6 -> 4.7

Account types (e.g. user, group, host) may have config options now. See baseType::get_configOptions().
+
+

4.5 -> 4.6

+The valid account types for each module must now be set in can_manage(). This function is abstract in base module. Setting the account type via meta data is no longer supported.

diff --git a/lam/lib/baseType.inc b/lam/lib/baseType.inc index 80e3493e..c1592d00 100644 --- a/lam/lib/baseType.inc +++ b/lam/lib/baseType.inc @@ -3,7 +3,7 @@ $Id$ This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/) - Copyright (C) 2005 - 2012 Roland Gruber + Copyright (C) 2005 - 2014 Roland Gruber 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 @@ -185,7 +185,34 @@ class baseType { public function runEditPagePostAction($container) { } + + /** + * Returns a list of configuration options. + * + * The field names are used as keywords to load and save settings. + * We recommend to use the type name as prefix for them (e.g. user_someSetting) to avoid naming conflicts. + * + * @return mixed htmlElement or array of htmlElement + * + * @see htmlElement + */ + public function get_configOptions() { + return null; + } + /** + * Checks input values of config settings. + *
+ * If the input data is invalid the return value is an array that contains subarrays to build StatusMessages ('message type', 'message head', 'message text'). + *
If no errors occured the function returns an empty array. + * + * @param array $options hash array (option name => value) that contains the input. The option values are all arrays containing one or more elements. + * @return array list of error messages + */ + public function check_configOptions(&$options) { + return array(); + } + } ?> \ No newline at end of file diff --git a/lam/lib/config.inc b/lam/lib/config.inc index c6ad7536..3e9570f6 100644 --- a/lam/lib/config.inc +++ b/lam/lib/config.inc @@ -201,6 +201,48 @@ function LAMVersion() { return '0.0.unknown'; } +/** + * Extracts config options from HTTP POST data. + * + * @param array $confTypes array (option name => type (e.g. multiselect)) + * @return array list of config options (name => array(values)) + */ +function extractConfigOptionsFromPOST($confTypes) { + $options = array(); + foreach ($confTypes as $element => $type) { + // text fields + if ($type == "text") { + $options[$element] = array($_POST[$element]); + } + // text fields + elseif ($type == "text_obfuscated") { + $options[$element] = array(obfuscateText($_POST[$element])); + } + // hidden fields + elseif ($type == "hidden") { + $options[$element] = array($_POST[$element]); + } + // checkboxes + elseif ($type == "checkbox") { + if (isset($_POST[$element]) && ($_POST[$element] == "on")) $options[$element] = array('true'); + else $options[$element] = array('false'); + } + // dropdownbox + elseif ($type == "select") { + $options[$element] = array($_POST[$element]); + } + // multiselect + elseif ($type == "multiselect") { + $options[$element] = $_POST[$element]; // value is already an array + } + // textarea + elseif ($type == "textarea") { + $options[$element] = explode("\r\n", $_POST[$element]); + } + } + return $options; +} + /** * Prints a meta refresh page diff --git a/lam/templates/config/conftypes.php b/lam/templates/config/conftypes.php index 163e2849..f3488975 100644 --- a/lam/templates/config/conftypes.php +++ b/lam/templates/config/conftypes.php @@ -227,6 +227,7 @@ if (sizeof($availableTypes) > 0) { $container->addElement($availableContainer, true); } +$_SESSION['conftypes_optionTypes'] = array(); // show active types if (sizeof($activeTypes) > 0) { $container->addElement(new htmlSubTitle(_("Active account types")), true); @@ -264,6 +265,20 @@ if (sizeof($activeTypes) > 0) { $attrsInput->setFieldSize(40); $activeContainer->addElement($attrsInput); $activeContainer->addNewLine(); + // type options + $typeObj = new $activeTypes[$i]; + $typeConfigOptions = $typeObj->get_configOptions(); + if (!empty($typeConfigOptions)) { + foreach ($typeConfigOptions as $typeConfigOption) { + $activeContainer->addElement($typeConfigOption, true); + } + // save option types to session + ob_start(); + $dummyIndex = 1; + $typeConfigOptionTypes = parseHtml(null, $typeConfigOptions, array(), true, $dummyIndex, 'user'); + ob_end_clean(); + $_SESSION['conftypes_optionTypes'] = array_merge($_SESSION['conftypes_optionTypes'], $typeConfigOptionTypes); + } // advanced options $advancedOptionsContent = new htmlTable(); // LDAP filter @@ -327,7 +342,13 @@ if (sizeof($activeTypes) > 0) { } $tabindex = 1; -parseHtml(null, $container, array(), false, $tabindex, 'user'); +$dynamicTypeOptions = array(); +foreach ($_SESSION['conftypes_optionTypes'] as $key => $value) { + if (isset($typeSettings[$key])) { + $dynamicTypeOptions[$key] = explode(LAMConfig::LINE_SEPARATOR, $typeSettings[$key]); + } +} +parseHtml(null, $container, $dynamicTypeOptions, false, $tabindex, 'user'); echo "\n"; @@ -403,6 +424,7 @@ function checkInput() { $typeSettings[$key] = $_POST[$key]; } } + $typeConfigOptions = extractConfigOptionsFromPOST($_SESSION['conftypes_optionTypes']); for ($i = 0; $i < sizeof($accountTypes); $i++) { // set hidden $key = "hidden_" . $accountTypes[$i]; @@ -418,6 +440,16 @@ function checkInput() { $key = "readOnly_" . $accountTypes[$i]; $typeSettings[$key] = (isset($_POST[$key]) && ($_POST[$key] == 'on')); } + // check dynamic type settings + $typeObj = new $accountTypes[$i]; + $typeMessages = $typeObj->check_configOptions($typeConfigOptions); + if (!empty($typeMessages)) { + $errors = array_merge($errors, $typeMessages); + } + } + // add dynamic type settings + foreach ($typeConfigOptions as $key => $value) { + $typeSettings[$key] = implode(LAMConfig::LINE_SEPARATOR, $value); } // save input $conf->set_typeSettings($typeSettings); diff --git a/lam/templates/config/moduleSettings.php b/lam/templates/config/moduleSettings.php index 4bf0d7d4..65892784 100644 --- a/lam/templates/config/moduleSettings.php +++ b/lam/templates/config/moduleSettings.php @@ -273,40 +273,7 @@ function checkInput() { // check module options // create option array to check and save - $options = array(); - $opt_keys = array_keys($_SESSION['conf_types']); - for ($i = 0; $i < sizeof($opt_keys); $i++) { - $element = $opt_keys[$i]; - // text fields - if ($_SESSION['conf_types'][$element] == "text") { - $options[$element] = array($_POST[$element]); - } - // text fields - elseif ($_SESSION['conf_types'][$element] == "text_obfuscated") { - $options[$element] = array(obfuscateText($_POST[$element])); - } - // hidden fields - elseif ($_SESSION['conf_types'][$element] == "hidden") { - $options[$element] = array($_POST[$element]); - } - // checkboxes - elseif ($_SESSION['conf_types'][$element] == "checkbox") { - if (isset($_POST[$element]) && ($_POST[$element] == "on")) $options[$element] = array('true'); - else $options[$element] = array('false'); - } - // dropdownbox - elseif ($_SESSION['conf_types'][$element] == "select") { - $options[$element] = array($_POST[$element]); - } - // multiselect - elseif ($_SESSION['conf_types'][$element] == "multiselect") { - $options[$element] = $_POST[$element]; // value is already an array - } - // textarea - elseif ($_SESSION['conf_types'][$element] == "textarea") { - $options[$element] = explode("\r\n", $_POST[$element]); - } - } + $options = extractConfigOptionsFromPOST($_SESSION['conf_types']); // get list of scopes of modules $scopes = array();