| 
									
										
										
										
											2013-11-17 19:05:10 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  | $Id$ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/) | 
					
						
							|  |  |  |   Copyright (C) 2013  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 | 
					
						
							|  |  |  |   the Free Software Foundation; either version 2 of the License, or | 
					
						
							|  |  |  |   (at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |   but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |   GNU General Public License for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |   along with this program; if not, write to the Free Software | 
					
						
							|  |  |  |   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  | * Multi edit tool that allows LDAP operations on multiple entries. | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * @author Roland Gruber | 
					
						
							|  |  |  | * @package tools | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** security functions */ | 
					
						
							|  |  |  | include_once("../lib/security.inc"); | 
					
						
							|  |  |  | /** access to configuration data */ | 
					
						
							|  |  |  | include_once("../lib/config.inc"); | 
					
						
							|  |  |  | /** access LDAP server */ | 
					
						
							|  |  |  | include_once("../lib/ldap.inc"); | 
					
						
							|  |  |  | /** used to print status messages */ | 
					
						
							|  |  |  | include_once("../lib/status.inc"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // start session
 | 
					
						
							|  |  |  | startSecureSession(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // die if no write access
 | 
					
						
							|  |  |  | if (!checkIfWriteAccessIsAllowed()) die(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | checkIfToolIsActive('toolMultiEdit'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | setlanguage(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ADD = 'add'; | 
					
						
							|  |  |  | const MOD = 'mod'; | 
					
						
							|  |  |  | const DEL = 'del'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | const STAGE_START = 'start'; | 
					
						
							|  |  |  | const STAGE_READ_FINISHED = 'readFinished'; | 
					
						
							|  |  |  | const STAGE_ACTIONS_CALCULATED = 'actionsCalculated'; | 
					
						
							|  |  |  | const STAGE_WRITING = 'writing'; | 
					
						
							|  |  |  | const STAGE_FINISHED = 'finished'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-17 19:05:10 +00:00
										 |  |  | if (isset($_GET['ajaxStatus'])) { | 
					
						
							|  |  |  | 	runAjaxActions(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | else { | 
					
						
							|  |  |  | 	displayStartPage(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Displays the main page of the multi edit tool. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function displayStartPage() { | 
					
						
							|  |  |  | 	// display main page
 | 
					
						
							|  |  |  | 	include 'main_header.php'; | 
					
						
							|  |  |  | 	echo '<div class="user-bright smallPaddingContent">'; | 
					
						
							|  |  |  | 	echo ("<form action=\"multiEdit.php\" method=\"post\">\n"); | 
					
						
							|  |  |  | 	$errors = array(); | 
					
						
							|  |  |  | 	$tabindex = 1; | 
					
						
							|  |  |  | 	$container = new htmlTable(); | 
					
						
							|  |  |  | 	$container->addElement(new htmlTitle(_("Multi edit")), true); | 
					
						
							|  |  |  | 	// LDAP suffix
 | 
					
						
							|  |  |  | 	$showRules = array('-' => array('otherSuffix')); | 
					
						
							|  |  |  | 	$hideRules = array(); | 
					
						
							|  |  |  | 	$container->addElement(new htmlOutputText(_('LDAP suffix'))); | 
					
						
							|  |  |  | 	$suffixGroup = new htmlTable(); | 
					
						
							|  |  |  | 	$types = $_SESSION['config']->get_ActiveTypes(); | 
					
						
							|  |  |  | 	$suffixes = array(); | 
					
						
							|  |  |  | 	foreach ($types as $type) { | 
					
						
							|  |  |  | 		$suffixes[getTypeAlias($type)] = $_SESSION['config']->get_Suffix($type); | 
					
						
							|  |  |  | 		$hideRules[$_SESSION['config']->get_Suffix($type)] = array('otherSuffix'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	$treeSuffix = $_SESSION['config']->get_Suffix('tree'); | 
					
						
							|  |  |  | 	if (!empty($treeSuffix)) { | 
					
						
							|  |  |  | 		$suffixes[_('Tree view')] = $_SESSION['config']->get_Suffix('tree'); | 
					
						
							|  |  |  | 		$hideRules[$_SESSION['config']->get_Suffix('tree')] = array('otherSuffix'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	$suffixes = array_flip($suffixes); | 
					
						
							|  |  |  | 	natcasesort($suffixes); | 
					
						
							|  |  |  | 	$suffixes = array_flip($suffixes); | 
					
						
							| 
									
										
										
										
											2013-11-23 13:51:48 +00:00
										 |  |  | 	$suffixes[_('Other')] = '-'; | 
					
						
							| 
									
										
										
										
											2013-11-17 19:05:10 +00:00
										 |  |  | 	$suffixValues = array_values($suffixes); | 
					
						
							|  |  |  | 	$valSuffix = empty($_POST['suffix']) ? $suffixValues[0] : $_POST['suffix']; | 
					
						
							|  |  |  | 	$suffixSelect = new htmlSelect('suffix', $suffixes, array($valSuffix)); | 
					
						
							|  |  |  | 	$suffixSelect->setHasDescriptiveElements(true); | 
					
						
							|  |  |  | 	$suffixSelect->setSortElements(false); | 
					
						
							|  |  |  | 	$suffixSelect->setTableRowsToShow($showRules); | 
					
						
							|  |  |  | 	$suffixSelect->setTableRowsToHide($hideRules); | 
					
						
							|  |  |  | 	$suffixGroup->addElement($suffixSelect); | 
					
						
							|  |  |  | 	$otherSuffixTable = new htmlTable(); | 
					
						
							|  |  |  | 	$valOtherSuffix = empty($_POST['otherSuffix']) ? '' : $_POST['otherSuffix']; | 
					
						
							|  |  |  | 	$otherSuffixTable->addElement(new htmlInputField('otherSuffix')); | 
					
						
							|  |  |  | 	$suffixGroup->addElement($otherSuffixTable); | 
					
						
							|  |  |  | 	$container->addElement($suffixGroup); | 
					
						
							|  |  |  | 	$container->addElement(new htmlHelpLink('700'), true); | 
					
						
							|  |  |  | 	// LDAP filter
 | 
					
						
							| 
									
										
										
										
											2013-11-23 13:22:54 +00:00
										 |  |  | 	$valFilter = empty($_POST['filter']) ? '(objectClass=inetOrgPerson)' : $_POST['filter']; | 
					
						
							| 
									
										
										
										
											2013-11-17 19:05:10 +00:00
										 |  |  | 	$container->addElement(new htmlTableExtendedInputField(_('LDAP filter'), 'filter', $valFilter, '701'), true); | 
					
						
							|  |  |  | 	// operation fields
 | 
					
						
							|  |  |  | 	$container->addElement(new htmlSubTitle(_('Operations')), true); | 
					
						
							|  |  |  | 	$container->addElement(new htmlOutputText(_('Type'))); | 
					
						
							|  |  |  | 	$container->addElement(new htmlOutputText(_('Attribute name'))); | 
					
						
							|  |  |  | 	$container->addElement(new htmlOutputText(_('Value'))); | 
					
						
							|  |  |  | 	$container->addElement(new htmlHelpLink('702'), true); | 
					
						
							|  |  |  | 	$opCount = empty($_POST['opcount']) ? '3' : $_POST['opcount']; | 
					
						
							|  |  |  | 	if (isset($_POST['addFields'])) { | 
					
						
							|  |  |  | 		$opCount += 3; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	$operations = array(_('Add') => ADD, _('Modify') => MOD, _('Delete') => DEL); | 
					
						
							|  |  |  | 	for ($i = 0; $i < $opCount; $i++) { | 
					
						
							|  |  |  | 		// operation type
 | 
					
						
							|  |  |  | 		$selOp = empty($_POST['op_' . $i]) ? ADD : $_POST['op_' . $i]; | 
					
						
							|  |  |  | 		$opSelect = new htmlSelect('op_' . $i, $operations, array($selOp)); | 
					
						
							|  |  |  | 		$opSelect->setHasDescriptiveElements(true); | 
					
						
							|  |  |  | 		$container->addElement($opSelect); | 
					
						
							|  |  |  | 		// attribute name
 | 
					
						
							|  |  |  | 		$attrVal = empty($_POST['attr_' . $i]) ? '' : $_POST['attr_' . $i]; | 
					
						
							|  |  |  | 		$container->addElement(new htmlInputField('attr_' . $i, $attrVal)); | 
					
						
							|  |  |  | 		$valVal = empty($_POST['val_' . $i]) ? '' : $_POST['val_' . $i]; | 
					
						
							|  |  |  | 		$container->addElement(new htmlInputField('val_' . $i, $valVal), true); | 
					
						
							|  |  |  | 		// check input
 | 
					
						
							|  |  |  | 		if (($selOp == ADD) && !empty($attrVal) && empty($valVal)) { | 
					
						
							|  |  |  | 			$errors[] = new htmlStatusMessage('ERROR', _('Please enter a value to add.'), htmlspecialchars($attrVal)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (($selOp == MOD) && !empty($attrVal) && empty($valVal)) { | 
					
						
							|  |  |  | 			$errors[] = new htmlStatusMessage('ERROR', _('Please enter a value to modify.'), htmlspecialchars($attrVal)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// add more fields
 | 
					
						
							|  |  |  | 	$container->addVerticalSpace('5px'); | 
					
						
							|  |  |  | 	$container->addElement(new htmlButton('addFields', _('Add more fields'))); | 
					
						
							|  |  |  | 	$container->addElement(new htmlHiddenInput('opcount', $opCount), true); | 
					
						
							|  |  |  | 	// error messages
 | 
					
						
							|  |  |  | 	if (sizeof($errors) > 0) { | 
					
						
							|  |  |  | 		$container->addVerticalSpace('20px'); | 
					
						
							|  |  |  | 		foreach ($errors as $error) { | 
					
						
							|  |  |  | 			$error->colspan = 5; | 
					
						
							|  |  |  | 			$container->addElement($error, true); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// action buttons
 | 
					
						
							|  |  |  | 	$container->addVerticalSpace('20px'); | 
					
						
							|  |  |  | 	$buttonGroup = new htmlGroup(); | 
					
						
							|  |  |  | 	$buttonGroup->colspan = 3; | 
					
						
							|  |  |  | 	$dryRunButton = new htmlButton('dryRun', _('Dry run')); | 
					
						
							|  |  |  | 	$dryRunButton->setIconClass('dryRunButton'); | 
					
						
							|  |  |  | 	$buttonGroup->addElement($dryRunButton); | 
					
						
							|  |  |  | 	$buttonGroup->addElement(new htmlSpacer('10px', null)); | 
					
						
							|  |  |  | 	$applyButton = new htmlButton('applyChanges', _('Apply changes')); | 
					
						
							|  |  |  | 	$applyButton->setIconClass('saveButton'); | 
					
						
							|  |  |  | 	$buttonGroup->addElement($applyButton); | 
					
						
							|  |  |  | 	$container->addElement($buttonGroup, true); | 
					
						
							|  |  |  | 	$container->addVerticalSpace('10px'); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	// run actions
 | 
					
						
							|  |  |  | 	if ((sizeof($errors) == 0) && (isset($_POST['dryRun']) || isset($_POST['applyChanges']))) { | 
					
						
							|  |  |  | 		runActions($container); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	parseHtml(null, $container, array(), false, $tabindex, 'user'); | 
					
						
							|  |  |  | 	echo ("</form>\n"); | 
					
						
							|  |  |  | 	echo '</div>'; | 
					
						
							|  |  |  | 	include 'main_footer.php'; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Runs the dry run and change actions. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * @param htmlTable $container container | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function runActions(&$container) { | 
					
						
							|  |  |  | 	// LDAP suffix
 | 
					
						
							|  |  |  | 	if ($_POST['suffix'] == '-') { | 
					
						
							|  |  |  | 		$suffix = trim($_POST['otherSuffix']); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							|  |  |  | 		$suffix = $_POST['suffix']; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (empty($suffix)) { | 
					
						
							|  |  |  | 		$error = new htmlStatusMessage('ERROR', _('LDAP Suffix is invalid!')); | 
					
						
							|  |  |  | 		$error->colspan = 5; | 
					
						
							|  |  |  | 		$container->addElement($error); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// LDAP filter
 | 
					
						
							|  |  |  | 	$filter = trim($_POST['filter']); | 
					
						
							|  |  |  | 	// operations
 | 
					
						
							|  |  |  | 	$operations = array(); | 
					
						
							| 
									
										
										
										
											2013-11-19 20:10:03 +00:00
										 |  |  | 	for ($i = 0; $i < $_POST['opcount']; $i++) { | 
					
						
							| 
									
										
										
										
											2013-11-17 19:05:10 +00:00
										 |  |  | 		if (!empty($_POST['attr_' . $i])) { | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 			$operations[] = array($_POST['op_' . $i], strtolower(trim($_POST['attr_' . $i])), trim($_POST['val_' . $i])); | 
					
						
							| 
									
										
										
										
											2013-11-17 19:05:10 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (sizeof($operations) == 0) { | 
					
						
							|  |  |  | 		$error = new htmlStatusMessage('ERROR', _('Please specify at least one operation.')); | 
					
						
							|  |  |  | 		$error->colspan = 5; | 
					
						
							|  |  |  | 		$container->addElement($error); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	$_SESSION['multiEdit_suffix'] = $suffix; | 
					
						
							|  |  |  | 	$_SESSION['multiEdit_filter'] = $filter; | 
					
						
							|  |  |  | 	$_SESSION['multiEdit_operations'] = $operations; | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 	$_SESSION['multiEdit_status'] = array('stage' => STAGE_START); | 
					
						
							|  |  |  | 	$_SESSION['multiEdit_dryRun'] = isset($_POST['dryRun']); | 
					
						
							| 
									
										
										
										
											2013-11-17 19:05:10 +00:00
										 |  |  | 	// disable all input elements
 | 
					
						
							|  |  |  | 	$jsContent = ' | 
					
						
							|  |  |  | 		jQuery(\'input\').attr(\'disabled\', true); | 
					
						
							|  |  |  | 		jQuery(\'select\').attr(\'disabled\', true); | 
					
						
							|  |  |  | 		jQuery(\'button\').attr(\'disabled\', true); | 
					
						
							|  |  |  | 	'; | 
					
						
							|  |  |  | 	$container->addElement(new htmlJavaScript($jsContent), true); | 
					
						
							|  |  |  | 	// progress area
 | 
					
						
							|  |  |  | 	$container->addElement(new htmlSubTitle(_('Progress')), true); | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 	$progressBarDiv = new htmlDiv('progressBar', ''); | 
					
						
							|  |  |  | 	$progressBarDiv->colspan = 5; | 
					
						
							|  |  |  | 	$container->addElement($progressBarDiv, true); | 
					
						
							| 
									
										
										
										
											2013-11-17 19:05:10 +00:00
										 |  |  | 	$progressDiv = new htmlDiv('progressArea', ''); | 
					
						
							|  |  |  | 	$progressDiv->colspan = 5; | 
					
						
							|  |  |  | 	$container->addElement($progressDiv, true); | 
					
						
							|  |  |  | 	// JS block for AJAX status update
 | 
					
						
							|  |  |  | 	$ajaxBlock = ' | 
					
						
							|  |  |  | 		jQuery.get(\'multiEdit.php?ajaxStatus\', null, function(data) {handleReply(data);}, \'json\'); | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		function handleReply(data) { | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 			jQuery(\'#progressBar\').progressbar({value: data.progress, max: 120});
 | 
					
						
							| 
									
										
										
										
											2013-11-17 19:05:10 +00:00
										 |  |  | 			jQuery(\'#progressArea\').html(data.content);
 | 
					
						
							|  |  |  | 			if (data.status != "finished") { | 
					
						
							|  |  |  | 				jQuery.get(\'multiEdit.php?ajaxStatus\', null, function(data) {handleReply(data);}, \'json\'); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else { | 
					
						
							|  |  |  | 				jQuery(\'input\').removeAttr(\'disabled\'); | 
					
						
							|  |  |  | 				jQuery(\'select\').removeAttr(\'disabled\'); | 
					
						
							|  |  |  | 				jQuery(\'button\').removeAttr(\'disabled\'); | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 				jQuery(\'#progressBar\').hide();
 | 
					
						
							| 
									
										
										
										
											2013-11-17 19:05:10 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	'; | 
					
						
							|  |  |  | 	$container->addElement(new htmlJavaScript($ajaxBlock), true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Performs the modify operations. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function runAjaxActions() { | 
					
						
							|  |  |  | 	$jsonReturn = array( | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 		'status' => STAGE_START, | 
					
						
							|  |  |  | 		'progress' => 0, | 
					
						
							|  |  |  | 		'content' => '' | 
					
						
							| 
									
										
										
										
											2013-11-17 19:05:10 +00:00
										 |  |  | 	); | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 	switch ($_SESSION['multiEdit_status']['stage']) { | 
					
						
							|  |  |  | 		case STAGE_START: | 
					
						
							|  |  |  | 			$jsonReturn = readLDAPData(); | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		case STAGE_READ_FINISHED: | 
					
						
							|  |  |  | 			$jsonReturn = generateActions(); | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		case STAGE_ACTIONS_CALCULATED: | 
					
						
							| 
									
										
										
										
											2013-11-23 13:22:54 +00:00
										 |  |  | 		case STAGE_WRITING: | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 			if ($_SESSION['multiEdit_dryRun']) { | 
					
						
							|  |  |  | 				$jsonReturn = dryRun(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else { | 
					
						
							|  |  |  | 				$jsonReturn = doModify(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-11-17 19:05:10 +00:00
										 |  |  | 	echo json_encode($jsonReturn); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Reads the LDAP entries from the directory. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * @return array status | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function readLDAPData() { | 
					
						
							|  |  |  | 	$suffix = $_SESSION['multiEdit_suffix']; | 
					
						
							|  |  |  | 	$filter = $_SESSION['multiEdit_filter']; | 
					
						
							|  |  |  | 	if (empty($filter)) { | 
					
						
							|  |  |  | 		$filter = '(objectClass=*)'; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	$operations = $_SESSION['multiEdit_operations']; | 
					
						
							|  |  |  | 	$attributes = array(); | 
					
						
							|  |  |  | 	foreach ($operations as $op) { | 
					
						
							|  |  |  | 		if (!in_array(strtolower($op[1]), $attributes)) { | 
					
						
							|  |  |  | 			$attributes[] = strtolower($op[1]); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// run LDAP query
 | 
					
						
							|  |  |  | 	$results = searchLDAP($suffix, $filter, $attributes); | 
					
						
							|  |  |  | 	// print error message if no data returned
 | 
					
						
							|  |  |  | 	if (empty($results)) { | 
					
						
							|  |  |  | 		$code = ldap_errno($_SESSION['ldap']->server()); | 
					
						
							|  |  |  | 		if ($code !== 0) { | 
					
						
							|  |  |  | 			$msg = new htmlStatusMessage('ERROR', _('Encountered an error while performing search.'), getDefaultLDAPErrorString($_SESSION['ldap']->server())); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			$msg = new htmlStatusMessage('ERROR', _('No objects found!')); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-11-23 13:22:54 +00:00
										 |  |  | 		$content = getMessageHTML($msg); | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 		return array( | 
					
						
							|  |  |  | 			'status' => STAGE_FINISHED, | 
					
						
							|  |  |  | 			'progress' => 120, | 
					
						
							|  |  |  | 			'content' => $content | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// save LDAP data
 | 
					
						
							|  |  |  | 	$_SESSION['multiEdit_status']['entries'] = $results; | 
					
						
							|  |  |  | 	$_SESSION['multiEdit_status']['stage'] = STAGE_READ_FINISHED; | 
					
						
							|  |  |  | 	return array( | 
					
						
							|  |  |  | 		'status' => STAGE_READ_FINISHED, | 
					
						
							|  |  |  | 		'progress' => 10, | 
					
						
							|  |  |  | 		'content' => '' | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Generates the required actions based on the read LDAP data. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * @return array status | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function generateActions() { | 
					
						
							|  |  |  | 	$actions = array(); | 
					
						
							|  |  |  | 	foreach ($_SESSION['multiEdit_status']['entries'] as $entry) { | 
					
						
							| 
									
										
										
										
											2013-11-19 20:10:03 +00:00
										 |  |  | 		$dn = $entry['dn']; | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 		foreach ($_SESSION['multiEdit_operations'] as $op) { | 
					
						
							|  |  |  | 			$opType = $op[0]; | 
					
						
							|  |  |  | 			$attr = $op[1]; | 
					
						
							|  |  |  | 			$val = $op[2]; | 
					
						
							|  |  |  | 			switch ($opType) { | 
					
						
							|  |  |  | 				case ADD: | 
					
						
							|  |  |  | 					if (empty($entry[$attr]) || !in_array_ignore_case($val, $entry[$attr])) { | 
					
						
							| 
									
										
										
										
											2013-11-19 20:10:03 +00:00
										 |  |  | 						$actions[] = array(ADD, $dn, $attr, $val); | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case MOD: | 
					
						
							| 
									
										
										
										
											2013-11-19 20:10:03 +00:00
										 |  |  | 					if (empty($entry[$attr])) { | 
					
						
							|  |  |  | 						// attribute not yet exists, add it
 | 
					
						
							|  |  |  | 						$actions[] = array(ADD, $dn, $attr, $val); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					elseif (!empty($entry[$attr]) && !in_array_ignore_case($val, $entry[$attr])) { | 
					
						
							|  |  |  | 						// attribute exists and value is not included, replace old values
 | 
					
						
							|  |  |  | 						$actions[] = array(MOD, $dn, $attr, $val); | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case DEL: | 
					
						
							|  |  |  | 					if (empty($val) && !empty($entry[$attr])) { | 
					
						
							| 
									
										
										
										
											2013-11-19 20:10:03 +00:00
										 |  |  | 						$actions[] = array(DEL, $dn, $attr, null); | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 					elseif (!empty($val) && in_array($val, $entry[$attr])) { | 
					
						
							| 
									
										
										
										
											2013-11-19 20:10:03 +00:00
										 |  |  | 						$actions[] = array(DEL, $dn, $attr, $val); | 
					
						
							| 
									
										
										
										
											2013-11-18 21:52:27 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// save actions
 | 
					
						
							|  |  |  | 	$_SESSION['multiEdit_status']['actions'] = $actions; | 
					
						
							|  |  |  | 	$_SESSION['multiEdit_status']['stage'] = STAGE_ACTIONS_CALCULATED; | 
					
						
							|  |  |  | 	return array( | 
					
						
							|  |  |  | 		'status' => STAGE_ACTIONS_CALCULATED, | 
					
						
							|  |  |  | 		'progress' => 20, | 
					
						
							|  |  |  | 		'content' => '' | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-19 20:10:03 +00:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Prints the dryRun output. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * @return array status | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function dryRun() { | 
					
						
							| 
									
										
										
										
											2013-11-23 13:22:54 +00:00
										 |  |  | 	$pro = isLAMProVersion() ? ' Pro' : ''; | 
					
						
							|  |  |  | 	$ldif = '# LDAP Account Manager' . $pro . ' ' . LAMVersion() . "\n\nversion: 1\n\n"; | 
					
						
							| 
									
										
										
										
											2013-11-19 20:10:03 +00:00
										 |  |  | 	$log = ''; | 
					
						
							|  |  |  | 	// fill LDIF and log file
 | 
					
						
							|  |  |  | 	$lastDN = ''; | 
					
						
							|  |  |  | 	foreach ($_SESSION['multiEdit_status']['actions'] as $action) { | 
					
						
							|  |  |  | 		$opType = $action[0]; | 
					
						
							|  |  |  | 		$dn = $action[1]; | 
					
						
							|  |  |  | 		$attr = $action[2]; | 
					
						
							|  |  |  | 		$val = $action[3]; | 
					
						
							|  |  |  | 		if ($lastDN != $dn) { | 
					
						
							|  |  |  | 			if ($lastDN != '') { | 
					
						
							|  |  |  | 				$log .= "\r\n"; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$lastDN = $dn; | 
					
						
							|  |  |  | 			$log .= $dn . "\r\n"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if ($lastDN != '') { | 
					
						
							|  |  |  | 			$ldif .= "\n"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$ldif .= 'dn: ' . $dn . "\n"; | 
					
						
							|  |  |  | 		$ldif .= 'changetype: modify' . "\n"; | 
					
						
							|  |  |  | 		switch ($opType) { | 
					
						
							|  |  |  | 			case ADD: | 
					
						
							|  |  |  | 				$log .= '+' . $attr . '=' . $val . "\r\n"; | 
					
						
							|  |  |  | 				$ldif .= 'add: ' . $attr . "\n"; | 
					
						
							|  |  |  | 				$ldif .= $attr . ': ' . $val . "\n"; | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case DEL: | 
					
						
							|  |  |  | 				$ldif .= 'delete: ' . $attr . "\n"; | 
					
						
							|  |  |  | 				if (empty($val)) { | 
					
						
							|  |  |  | 					$log .= '-' . $attr . "\r\n";	 | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				else { | 
					
						
							|  |  |  | 					$log .= '-' . $attr . '=' . $val . "\r\n"; | 
					
						
							|  |  |  | 					$ldif .= $attr . ': ' . $val . "\n"; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case MOD: | 
					
						
							|  |  |  | 				$log .= '*' . $attr . '=' . $val . "\r\n"; | 
					
						
							|  |  |  | 				$ldif .= 'replace: ' . $attr . "\n"; | 
					
						
							|  |  |  | 				$ldif .= $attr . ': ' . $val . "\n"; | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// build meta HTML
 | 
					
						
							|  |  |  | 	$container = new htmlTable(); | 
					
						
							|  |  |  | 	$container->addElement(new htmlOutputText(_('DryRun finished.')), true); | 
					
						
							|  |  |  | 	$container->addVerticalSpace('20px'); | 
					
						
							|  |  |  | 	// store LDIF
 | 
					
						
							|  |  |  | 	$filename = 'ldif' . getRandomNumber() . '.ldif'; | 
					
						
							|  |  |  | 	$out = @fopen(dirname(__FILE__) . '/../tmp/' . $filename, "wb"); | 
					
						
							|  |  |  | 	fwrite($out, $ldif); | 
					
						
							|  |  |  | 	$container->addElement(new htmlOutputText(_('LDIF file')), true); | 
					
						
							|  |  |  | 	$ldifLink = new htmlLink($filename, '../tmp/' . $filename); | 
					
						
							|  |  |  | 	$ldifLink->setTargetWindow('_blank'); | 
					
						
							|  |  |  | 	$container->addElement($ldifLink, true); | 
					
						
							|  |  |  | 	$container->addVerticalSpace('20px'); | 
					
						
							|  |  |  | 	$container->addElement(new htmlOutputText(_('Log output')), true); | 
					
						
							|  |  |  | 	$container->addElement(new htmlInputTextarea('log', $log, 100, 30), true); | 
					
						
							|  |  |  | 	// generate HTML
 | 
					
						
							|  |  |  | 	fclose ($out); | 
					
						
							|  |  |  | 	ob_start(); | 
					
						
							|  |  |  | 	$tabindex = 1; | 
					
						
							|  |  |  | 	parseHtml(null, $container, array(), true, $tabindex, 'user'); | 
					
						
							|  |  |  | 	$content = ob_get_contents(); | 
					
						
							|  |  |  | 	ob_end_clean(); | 
					
						
							|  |  |  | 	return array( | 
					
						
							|  |  |  | 		'status' => STAGE_FINISHED, | 
					
						
							|  |  |  | 		'progress' => 120, | 
					
						
							|  |  |  | 		'content' => $content | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-11-23 13:22:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * 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) . "<br>"; | 
					
						
							|  |  |  | 		// 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'] .= '<br><br>' . _('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; | 
					
						
							|  |  |  | } |