diff --git a/lam/HISTORY b/lam/HISTORY
index 3f2692ed..68d252e3 100644
--- a/lam/HISTORY
+++ b/lam/HISTORY
@@ -1,7 +1,8 @@
December 2013 4.4
- PyKota support: users, groups, printers, billing codes
- Kolab shared folder support
- - allow to set a custom label for each account type
+ - New tool "Multi edit" allows LDAP operations on a large number of entries (e.g. adding attributes)
+ - Allow to set a custom label for each account type
- Unix: switch also additional membership if primary group is changed (RFE 108)
- Windows: fixed user name handling, sAMAccountName now optional
- Apache 2.4 support (requires Apache "version" module)
diff --git a/lam/templates/multiEdit.php b/lam/templates/multiEdit.php
index 7f83c4da..6902557b 100644
--- a/lam/templates/multiEdit.php
+++ b/lam/templates/multiEdit.php
@@ -111,7 +111,7 @@ function displayStartPage() {
$container->addElement($suffixGroup);
$container->addElement(new htmlHelpLink('700'), true);
// LDAP filter
- $valFilter = empty($_POST['filter']) ? '' : $_POST['filter'];
+ $valFilter = empty($_POST['filter']) ? '(objectClass=inetOrgPerson)' : $_POST['filter'];
$container->addElement(new htmlTableExtendedInputField(_('LDAP filter'), 'filter', $valFilter, '701'), true);
// operation fields
$container->addElement(new htmlSubTitle(_('Operations')), true);
@@ -273,6 +273,7 @@ function runAjaxActions() {
$jsonReturn = generateActions();
break;
case STAGE_ACTIONS_CALCULATED:
+ case STAGE_WRITING:
if ($_SESSION['multiEdit_dryRun']) {
$jsonReturn = dryRun();
}
@@ -313,11 +314,7 @@ function readLDAPData() {
else {
$msg = new htmlStatusMessage('ERROR', _('No objects found!'));
}
- $tabindex = 0;
- ob_start();
- parseHtml(null, $msg, array(), true, $tabindex, 'user');
- $content = ob_get_contents();
- ob_end_clean();
+ $content = getMessageHTML($msg);
return array(
'status' => STAGE_FINISHED,
'progress' => 120,
@@ -390,7 +387,8 @@ function generateActions() {
* @return array status
*/
function dryRun() {
- $ldif = '';
+ $pro = isLAMProVersion() ? ' Pro' : '';
+ $ldif = '# LDAP Account Manager' . $pro . ' ' . LAMVersion() . "\n\nversion: 1\n\n";
$log = '';
// fill LDIF and log file
$lastDN = '';
@@ -462,3 +460,83 @@ function dryRun() {
'content' => $content
);
}
+
+/**
+ * Runs the actual modifications.
+ *
+ * @return array status
+ */
+function doModify() {
+ // initial action index
+ if (!isset($_SESSION['multiEdit_status']['index'])) {
+ $_SESSION['multiEdit_status']['index'] = 0;
+ }
+ // initial content
+ if (!isset($_SESSION['multiEdit_status']['modContent'])) {
+ $_SESSION['multiEdit_status']['modContent'] = '';
+ }
+ // run 10 modifications in each call
+ $localCount = 0;
+ while (($localCount < 10) && ($_SESSION['multiEdit_status']['index'] < sizeof($_SESSION['multiEdit_status']['actions']))) {
+ $action = $_SESSION['multiEdit_status']['actions'][$_SESSION['multiEdit_status']['index']];
+ $opType = $action[0];
+ $dn = $action[1];
+ $attr = $action[2];
+ $val = $action[3];
+ $_SESSION['multiEdit_status']['modContent'] .= htmlspecialchars($dn) . "
";
+ // run LDAP commands
+ $success = false;
+ switch ($opType) {
+ case ADD:
+ $success = @ldap_mod_add($_SESSION['ldap']->server(), $dn, array($attr => array($val)));
+ break;
+ case DEL:
+ if (empty($val)) {
+ $success = ldap_modify($_SESSION['ldap']->server(), $dn, array($attr => array()));
+ }
+ else {
+ $success = ldap_mod_del($_SESSION['ldap']->server(), $dn, array($attr => array($val)));
+ }
+ break;
+ case MOD:
+ $success = ldap_modify($_SESSION['ldap']->server(), $dn, array($attr => array($val)));
+ break;
+ }
+ if (!$success) {
+ $msg = new htmlStatusMessage('ERROR', getDefaultLDAPErrorString($_SESSION['ldap']->server()));
+ $_SESSION['multiEdit_status']['modContent'] .= getMessageHTML($msg);
+ }
+ $localCount++;
+ $_SESSION['multiEdit_status']['index']++;
+ }
+ // check if finished
+ if ($_SESSION['multiEdit_status']['index'] == sizeof($_SESSION['multiEdit_status']['actions'])) {
+ $_SESSION['multiEdit_status']['modContent'] .= '
' . _('Finished all operations.');
+ return array(
+ 'status' => STAGE_FINISHED,
+ 'progress' => 120,
+ 'content' => $_SESSION['multiEdit_status']['modContent']
+ );
+ }
+ // return current status
+ return array(
+ 'status' => STAGE_WRITING,
+ 'progress' => 20 + (($_SESSION['multiEdit_status']['index'] / sizeof($_SESSION['multiEdit_status']['actions'])) * 100),
+ 'content' => $_SESSION['multiEdit_status']['modContent']
+ );
+}
+
+/**
+ * Returns the HTML code for a htmlStatusMessage
+ *
+ * @param htmlStatusMessage $msg message
+ * @return String HTML code
+ */
+function getMessageHTML($msg) {
+ $tabindex = 0;
+ ob_start();
+ parseHtml(null, $msg, array(), true, $tabindex, 'user');
+ $content = ob_get_contents();
+ ob_end_clean();
+ return $content;
+}