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();