| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  | $Id$ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/) | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  |   Copyright (C) 2015 - 2016  Roland Gruber | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  | * Manages memberships in NIS net groups. | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * @package modules | 
					
						
							|  |  |  | * @author Roland Gruber | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  | * Manages memberships in NIS net groups. | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * @package modules | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | class nisNetGroupUser extends baseModule { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** list of NIS netgroups the user is memberOf (array(array(name => '', dn => '', host => '', domain => ''))) */ | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 	protected $groups = array(); | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	/** list of NIS netgroups the user was memberOf (array(array(name => '', dn => '', host => '', domain => ''))) */ | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 	protected $groupsOrig = array(); | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	/** group cache (array(array(cn => '', dn => '', nisnetgrouptriple => array()))) */ | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 	protected $groupCache = null; | 
					
						
							| 
									
										
										
										
											2015-05-25 18:50:21 +00:00
										 |  |  | 	/** original uid */ | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 	protected $uidOrig = null; | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	* Returns true if this module can manage accounts of the current type, otherwise false. | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 	* | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	* @return boolean true if module fits | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	public function can_manage() { | 
					
						
							|  |  |  | 		return in_array($this->get_scope(), array('user')); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	* Returns meta data that is interpreted by parent class | 
					
						
							|  |  |  | 	* | 
					
						
							|  |  |  | 	* @return array array with meta data | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 	* | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	* @see baseModule::get_metaData() | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	public function get_metaData() { | 
					
						
							|  |  |  | 		$return = array(); | 
					
						
							|  |  |  | 		// icon
 | 
					
						
							|  |  |  | 		$return['icon'] = 'groupBig.png'; | 
					
						
							|  |  |  | 		// module dependencies
 | 
					
						
							|  |  |  | 		$return['dependencies'] = array('depends' => array(array('posixAccount', 'inetOrgPerson')), 'conflicts' => array()); | 
					
						
							|  |  |  | 		// alias name
 | 
					
						
							|  |  |  | 		$return["alias"] = _("NIS net groups"); | 
					
						
							|  |  |  | 		// available PDF fields
 | 
					
						
							|  |  |  | 		$return['PDF_fields']['memberships'] = _('NIS net groups'); | 
					
						
							|  |  |  | 		// help Entries
 | 
					
						
							|  |  |  | 		$return['help'] = array( | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 			'memberships_upload' => array( | 
					
						
							|  |  |  | 				"Headline" => _('NIS net groups'), | 
					
						
							|  |  |  | 				"Text" => _("Here you can enter a list of net groups. Group blocks are separated by comma in format GROUP#HOST#DOMAIN. Host and domain are optional.") | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 			), | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		// upload columns
 | 
					
						
							|  |  |  | 		$return['upload_columns'][] = array( | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 			'name' => 'nisNetGroup_memberships', | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 			'description' => _('Memberships'), | 
					
						
							|  |  |  | 			'help' => 'memberships_upload', | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 			'example' => 'group1#host#domain,group2#host#domain' | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		); | 
					
						
							|  |  |  | 		return $return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	* This function fills the $messages variable with output messages from this module. | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	function load_Messages() { | 
					
						
							|  |  |  | 		$this->messages['host'][0] = array('ERROR', _('Host name'), _('Host name contains invalid characters. Valid characters are: a-z, A-Z, 0-9 and .-_ !')); | 
					
						
							|  |  |  | 		$this->messages['domain'][0] = array('ERROR', _('Domain name'), _('Domain name is invalid!')); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	* Initializes the module after it became part of an accountContainer | 
					
						
							|  |  |  | 	* | 
					
						
							|  |  |  | 	* @param string $base the name of the accountContainer object ($_SESSION[$base]) | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	function init($base) { | 
					
						
							|  |  |  | 		// call parent init
 | 
					
						
							|  |  |  | 		parent::init($base); | 
					
						
							|  |  |  | 		$this->groups = array(); | 
					
						
							|  |  |  | 		$this->groupsOrig = array(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * This function loads all needed LDAP attributes. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param array $attr list of attributes | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	function load_attributes($attr) { | 
					
						
							|  |  |  | 		parent::load_attributes($attr); | 
					
						
							|  |  |  | 		if (empty($attr['uid'][0])) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 		$this->uidOrig = $attr['uid'][0]; | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		$types = array('netgroup'); | 
					
						
							|  |  |  | 		$typeSettings = $_SESSION['config']->get_typeSettings(); | 
					
						
							|  |  |  | 		$groupList = array(); | 
					
						
							|  |  |  | 		$filter = '(&(objectClass=nisNetgroup)(nisnetgrouptriple=*))'; | 
					
						
							|  |  |  | 		if (!empty($typeSettings['filter_' . $types[0]])) { | 
					
						
							|  |  |  | 			$typeFilter = $typeSettings['filter_' . $types[0]]; | 
					
						
							|  |  |  | 			if (strpos($typeFilter, '(') !== 0) { | 
					
						
							|  |  |  | 				$typeFilter = '(' . $typeFilter . ')'; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$filter = '(&' . $filter . $typeFilter . ')'; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$groupList = searchLDAPByFilter($filter, array('dn', 'cn', 'nisnetgrouptriple'), $types); | 
					
						
							|  |  |  | 		$this->groupsOrig = array(); | 
					
						
							|  |  |  | 		$tripleRegex = '/^\\(([^,]*),([^,]*),([^,]*)\\)$/'; | 
					
						
							|  |  |  | 		foreach ($groupList as $group) { | 
					
						
							|  |  |  | 			foreach ($group['nisnetgrouptriple'] as $triple) { | 
					
						
							|  |  |  | 				$matches = array(); | 
					
						
							|  |  |  | 				if (preg_match($tripleRegex, $triple, $matches) == 0) { | 
					
						
							|  |  |  | 					continue; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				$host = $matches[1]; | 
					
						
							|  |  |  | 				$user = $matches[2]; | 
					
						
							|  |  |  | 				$domain = $matches[3]; | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 				if ($this->isMatchingNetGroup($user, $host, $domain, $this->uidOrig)) { | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 					$this->groupsOrig[] = array( | 
					
						
							|  |  |  | 						'name' => $group['cn'][0], | 
					
						
							|  |  |  | 						'dn' => $group['dn'], | 
					
						
							|  |  |  | 						'host' => $host, | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 						'user' => $user, | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 						'domain' => $domain | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		usort($this->groupsOrig, array($this, 'sortTriple')); | 
					
						
							|  |  |  | 		$this->groups = $this->groupsOrig; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Checks if the netgroup matches this entry. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param String $user netgroup user name | 
					
						
							|  |  |  | 	 * @param String $host netgroup host name | 
					
						
							|  |  |  | 	 * @param String $domain netgroup domain name | 
					
						
							|  |  |  | 	 * @param String $uid user name of this entry | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	protected function isMatchingNetGroup($user, $host, $domain, $uid) { | 
					
						
							|  |  |  | 		return $user == $uid; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	* Displays the group selection. | 
					
						
							|  |  |  | 	* | 
					
						
							|  |  |  | 	* @return htmlElement meta HTML code | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	public function display_html_attributes() { | 
					
						
							|  |  |  | 		$return = new htmlTable(); | 
					
						
							|  |  |  | 		$return->addElement(new htmlOutputText(_('Group'))); | 
					
						
							|  |  |  | 		$return->addElement(new htmlOutputText(_('Host name'))); | 
					
						
							|  |  |  | 		$return->addElement(new htmlOutputText(_('Domain name')), true); | 
					
						
							|  |  |  | 		for ($i = 0; $i < sizeof($this->groups); $i++) { | 
					
						
							|  |  |  | 			$group = $this->groups[$i]; | 
					
						
							|  |  |  | 			$return->addElement(new htmlOutputText($group['name'])); | 
					
						
							|  |  |  | 			$return->addElement(new htmlInputField('host_' . $i, $group['host'])); | 
					
						
							|  |  |  | 			$return->addElement(new htmlInputField('domain_' . $i, $group['domain'])); | 
					
						
							|  |  |  | 			$delButton = new htmlButton('del_' . $i, 'del.png', true); | 
					
						
							|  |  |  | 			$delButton->setTitle(_('Delete')); | 
					
						
							|  |  |  | 			$return->addElement($delButton, true); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-06-01 17:41:42 +00:00
										 |  |  | 		$return->addVerticalSpace('40px'); | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		// new entry
 | 
					
						
							|  |  |  | 		$groupList = array(); | 
					
						
							|  |  |  | 		$groupData = $this->findGroups(); | 
					
						
							|  |  |  | 		if (sizeof($groupData) > 0) { | 
					
						
							| 
									
										
										
										
											2015-06-01 17:41:42 +00:00
										 |  |  | 			$filterGroup = new htmlGroup(); | 
					
						
							|  |  |  | 			$filterGroup->addElement(new htmlOutputText(_('Filter') . ' ')); | 
					
						
							|  |  |  | 			$filter = new htmlInputField('group_filter'); | 
					
						
							|  |  |  | 			$filter->setFieldSize('5em'); | 
					
						
							| 
									
										
										
										
											2016-03-19 09:06:53 +00:00
										 |  |  | 			$filter->filterSelectBox('group_add'); | 
					
						
							| 
									
										
										
										
											2015-06-01 17:41:42 +00:00
										 |  |  | 			$filterGroup->addElement($filter); | 
					
						
							|  |  |  | 			$return->addElement($filterGroup, true); | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 			foreach ($groupData as $group) { | 
					
						
							|  |  |  | 				$groupList[$group['cn'][0]] = $group['cn'][0] . '#+#' . $group['dn']; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$groupSelect = new htmlSelect('group_add', $groupList); | 
					
						
							|  |  |  | 			$groupSelect->setHasDescriptiveElements(true); | 
					
						
							|  |  |  | 			$return->addElement($groupSelect); | 
					
						
							|  |  |  | 			$return->addElement(new htmlInputField('host_add')); | 
					
						
							|  |  |  | 			$return->addElement(new htmlInputField('domain_add')); | 
					
						
							|  |  |  | 			$addButton = new htmlButton('addGroup', 'add.png', true); | 
					
						
							|  |  |  | 			$addButton->setTitle(_('Add')); | 
					
						
							|  |  |  | 			$return->addElement($addButton, true); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return $return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	* Processes user input of the group selection page. | 
					
						
							|  |  |  | 	* It checks if all input values are correct and updates the associated LDAP attributes. | 
					
						
							|  |  |  | 	* | 
					
						
							|  |  |  | 	* @return array list of info/error messages | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	public function process_attributes() { | 
					
						
							|  |  |  | 		$errors = array(); | 
					
						
							|  |  |  | 		// add new entry
 | 
					
						
							|  |  |  | 		if (isset($_POST['addGroup'])) { | 
					
						
							|  |  |  | 			$parts = explode('#+#', $_POST['group_add']); | 
					
						
							|  |  |  | 			$this->groups[] = array( | 
					
						
							|  |  |  | 				'name' => $parts[0], | 
					
						
							|  |  |  | 				'dn' => $parts[1], | 
					
						
							|  |  |  | 				'host' => $_POST['host_add'], | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 				'user' => $this->uidOrig, | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 				'domain' => $_POST['domain_add'] | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 			if (!empty($_POST['host_add']) && !get_preg($_POST['host_add'], 'DNSname')) { | 
					
						
							|  |  |  | 				$message = $this->messages['host'][0]; | 
					
						
							|  |  |  | 				$message[2] = $message[2] . '<br><br>' . $_POST['host_add']; | 
					
						
							|  |  |  | 				$errors[] = $message; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (!empty($_POST['domain_add']) && !get_preg($_POST['domain_add'], 'DNSname')) { | 
					
						
							|  |  |  | 				$message = $this->messages['domain'][0]; | 
					
						
							|  |  |  | 				$message[2] = $message[2] . '<br><br>' . $_POST['domain_add']; | 
					
						
							|  |  |  | 				$errors[] = $message; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		// check existing
 | 
					
						
							|  |  |  | 		$counter = 0; | 
					
						
							|  |  |  | 		while (isset($_POST['host_' . $counter])) { | 
					
						
							|  |  |  | 			if (isset($_POST['del_' . $counter])) { | 
					
						
							|  |  |  | 				unset($this->groups[$counter]); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else { | 
					
						
							|  |  |  | 				$this->groups[$counter]['host'] = $_POST['host_' . $counter]; | 
					
						
							|  |  |  | 				if (!empty($_POST['host_' . $counter]) && !get_preg($_POST['host_' . $counter], 'DNSname')) { | 
					
						
							|  |  |  | 					$message = $this->messages['host'][0]; | 
					
						
							|  |  |  | 					$message[2] = $message[2] . '<br><br>' . $_POST['host_' . $counter]; | 
					
						
							|  |  |  | 					$errors[] = $message; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				$this->groups[$counter]['domain'] = $_POST['domain_' . $counter]; | 
					
						
							|  |  |  | 				if (!empty($_POST['domain_' . $counter]) && !get_preg($_POST['domain_' . $counter], 'DNSname')) { | 
					
						
							|  |  |  | 					$message = $this->messages['domain'][0]; | 
					
						
							|  |  |  | 					$message[2] = $message[2] . '<br><br>' . $_POST['domain_' . $counter]; | 
					
						
							|  |  |  | 					$errors[] = $message; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$counter++; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$this->groups = array_values($this->groups); | 
					
						
							|  |  |  | 		usort($this->groups, array($this, 'sortTriple')); | 
					
						
							|  |  |  | 		return $errors; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 	 * Returns the user ID for this user. | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 	 * | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 	 * @return String user ID | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 	protected function getUid() { | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		$moduleAttributes = array(); | 
					
						
							|  |  |  | 		if ($this->getAccountContainer()->getAccountModule('posixAccount') != null) { | 
					
						
							|  |  |  | 			$moduleAttributes = $this->getAccountContainer()->getAccountModule('posixAccount')->getAttributes(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			$moduleAttributes = $this->getAccountContainer()->getAccountModule('inetOrgPerson')->getAttributes(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (empty($moduleAttributes['uid'][0])) { | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 			return null; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return $moduleAttributes['uid'][0]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Runs the postmodify actions. | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 	 * | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 	 * @see baseModule::postModifyActions() | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param boolean $newAccount | 
					
						
							|  |  |  | 	 * @param array $attributes LDAP attributes of this entry | 
					
						
							|  |  |  | 	 * @return array array which contains status messages. Each entry is an array containing the status message parameters. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function postModifyActions($newAccount, $attributes) { | 
					
						
							| 
									
										
										
										
											2015-06-18 17:34:44 +00:00
										 |  |  | 		$accountContainer = $this->getAccountContainer(); | 
					
						
							|  |  |  | 		if (empty($accountContainer)) { | 
					
						
							|  |  |  | 			return array(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 		$uid = $this->getUid(); | 
					
						
							|  |  |  | 		if (empty($uid)) { | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 			return array(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$ldapUser = $_SESSION['ldap']->decrypt_login(); | 
					
						
							|  |  |  | 		$ldapUser = $ldapUser[0]; | 
					
						
							|  |  |  | 		$messages = array(); | 
					
						
							|  |  |  | 		// calculate differences
 | 
					
						
							|  |  |  | 		$toRem = $this->groupsOrig; | 
					
						
							|  |  |  | 		$toAdd = $this->groups; | 
					
						
							|  |  |  | 		$counter = sizeof($toRem); | 
					
						
							|  |  |  | 		for ($i = 0; $i < $counter; $i++) { | 
					
						
							|  |  |  | 			$group_orig = $toRem[$i]; | 
					
						
							|  |  |  | 			foreach ($toAdd as $k => $group) { | 
					
						
							|  |  |  | 				if (($group_orig['dn'] == $group['dn']) | 
					
						
							|  |  |  | 					&& ($group_orig['domain'] == $group['domain']) | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 					&& ($group_orig['user'] == $group['user']) | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 					&& ($group_orig['host'] == $group['host'])) { | 
					
						
							| 
									
										
										
										
											2015-05-25 18:50:21 +00:00
										 |  |  | 					if (!empty($this->uidOrig) && ($this->uidOrig != $uid)) { | 
					
						
							|  |  |  | 						// uid changed, simply update uid in all net groups
 | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					else { | 
					
						
							|  |  |  | 						// do not touch existing memberships
 | 
					
						
							|  |  |  | 						unset($toRem[$i]); | 
					
						
							|  |  |  | 						unset($toAdd[$k]); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		// group by DN
 | 
					
						
							|  |  |  | 		$changes = array(); | 
					
						
							|  |  |  | 		foreach ($toAdd as $add) { | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 			$changes[$add['dn']]['add'][] = $this->createNetGroupValue($add, $uid); | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		foreach ($toRem as $del) { | 
					
						
							| 
									
										
										
										
											2015-05-25 18:50:21 +00:00
										 |  |  | 			$delUid = empty($this->uidOrig) ? $uid : $this->uidOrig; | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 			$changes[$del['dn']]['del'][] = $this->createNetGroupValue($del, $delUid); | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 		// update groups
 | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		foreach ($changes as $dn => $changeSet) { | 
					
						
							|  |  |  | 			$current = ldapGetDN($dn, array('nisnetgrouptriple')); | 
					
						
							|  |  |  | 			if (empty($current)) { | 
					
						
							|  |  |  | 				$messages[] = array('ERROR', sprintf(_('Was unable to modify attributes of DN: %s.'), $dn)); | 
					
						
							|  |  |  | 				continue; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$triples = empty($current['nisnetgrouptriple']) ? array() : $current['nisnetgrouptriple']; | 
					
						
							|  |  |  | 			if (!empty($changeSet['del'])) { | 
					
						
							|  |  |  | 				$triples = array_delete($changeSet['del'], $triples); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (!empty($changeSet['add'])) { | 
					
						
							|  |  |  | 				$triples = array_merge($changeSet['add'], $triples); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$triples = array_values(array_unique($triples)); | 
					
						
							|  |  |  | 			$attributes = array( | 
					
						
							|  |  |  | 				'nisnetgrouptriple' => $triples | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			$success = @ldap_mod_replace($_SESSION['ldap']->server(), $dn, $attributes); | 
					
						
							|  |  |  | 			if (!$success) { | 
					
						
							|  |  |  | 				logNewMessage(LOG_ERR, '[' . $ldapUser .'] Unable to modify attributes of DN: ' . $dn . ' (' . ldap_error($_SESSION['ldap']->server()) . ').'); | 
					
						
							|  |  |  | 				$messages[] = array('ERROR', sprintf(_('Was unable to modify attributes of DN: %s.'), $dn), getDefaultLDAPErrorString($_SESSION['ldap']->server())); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return $messages; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Creates a netgroup triple from a group object. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param String $group group object | 
					
						
							|  |  |  | 	 * @param String $uid own uid | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	protected function createNetGroupValue($group, $uid) { | 
					
						
							|  |  |  | 		return '(' . $group['host'] . ',' . $uid . ',' . $group['domain'] . ')'; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	* Additional LDAP operations on delete. | 
					
						
							|  |  |  | 	* | 
					
						
							|  |  |  | 	* @return List of LDAP operations, same as for save_attributes() | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	function delete_attributes() { | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 		$uid = $this->getUid(); | 
					
						
							|  |  |  | 		if (empty($uid)) { | 
					
						
							|  |  |  | 			return array(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$ldapUser = $_SESSION['ldap']->decrypt_login(); | 
					
						
							|  |  |  | 		$ldapUser = $ldapUser[0]; | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		$return = array(); | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 		// remove from NIS netgroups
 | 
					
						
							|  |  |  | 		$changes = array(); | 
					
						
							|  |  |  | 		foreach ($this->groups as $group) { | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 			$changes[$group['dn']][] = $this->createNetGroupValue($group, $uid); | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		foreach ($changes as $dn => $changeSet) { | 
					
						
							|  |  |  | 			$current = ldapGetDN($dn, array('nisnetgrouptriple')); | 
					
						
							|  |  |  | 			if (empty($current)) { | 
					
						
							|  |  |  | 				$messages[] = array('ERROR', sprintf(_('Was unable to modify attributes of DN: %s.'), $dn)); | 
					
						
							|  |  |  | 				continue; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$triples = empty($current['nisnetgrouptriple']) ? array() : $current['nisnetgrouptriple']; | 
					
						
							|  |  |  | 			$triples = array_delete($changeSet, $triples); | 
					
						
							|  |  |  | 			$triples = array_values(array_unique($triples)); | 
					
						
							|  |  |  | 			$attributes = array( | 
					
						
							|  |  |  | 				'nisnetgrouptriple' => $triples | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			$success = @ldap_mod_replace($_SESSION['ldap']->server(), $dn, $attributes); | 
					
						
							|  |  |  | 			if (!$success) { | 
					
						
							|  |  |  | 				logNewMessage(LOG_ERR, '[' . $ldapUser .'] Unable to modify attributes of DN: ' . $dn . ' (' . ldap_error($_SESSION['ldap']->server()) . ').'); | 
					
						
							|  |  |  | 				$messages[] = array('ERROR', sprintf(_('Was unable to modify attributes of DN: %s.'), $dn), getDefaultLDAPErrorString($_SESSION['ldap']->server())); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		return $return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	* Returns a list of elements for the account profiles. | 
					
						
							|  |  |  | 	* | 
					
						
							|  |  |  | 	* @return profile elements | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	function get_profileOptions() { | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 		$groups = $this->findGroups(); | 
					
						
							|  |  |  | 		$groupOptions = array('' => ''); | 
					
						
							|  |  |  | 		foreach ($groups as $group) { | 
					
						
							|  |  |  | 			$groupOptions[$group['cn'][0]] = $group['cn'][0] . '#+#' . $group['dn']; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		$return = new htmlTable(); | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 		$return->addElement(new htmlOutputText(_('Group'))); | 
					
						
							|  |  |  | 		$return->addElement(new htmlOutputText(_('Host name'))); | 
					
						
							|  |  |  | 		$return->addElement(new htmlOutputText(_('Domain name')), true); | 
					
						
							|  |  |  | 		for ($i = 0; $i < 5; $i++) { | 
					
						
							|  |  |  | 			$select = new htmlSelect('nisNetGroupUser_group' . $i, $groupOptions, array('')); | 
					
						
							|  |  |  | 			$select->setHasDescriptiveElements(true); | 
					
						
							|  |  |  | 			$return->addElement($select); | 
					
						
							|  |  |  | 			$return->addElement(new htmlInputField('nisNetGroupUser_host' . $i)); | 
					
						
							|  |  |  | 			$return->addElement(new htmlInputField('nisNetGroupUser_domain' . $i), true); | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		return $return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	* Loads the values of an account profile into internal variables. | 
					
						
							|  |  |  | 	* | 
					
						
							|  |  |  | 	* @param array $profile hash array with profile values (identifier => value) | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	function load_profile($profile) { | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 		for ($i = 0; $i < 5; $i++) { | 
					
						
							|  |  |  | 			if (!empty($profile['nisNetGroupUser_group' . $i][0])) { | 
					
						
							|  |  |  | 				$parts = explode('#+#', $profile['nisNetGroupUser_group' . $i][0]); | 
					
						
							|  |  |  | 				$this->groups[] = array( | 
					
						
							|  |  |  | 					'name' => $parts[0], | 
					
						
							|  |  |  | 					'dn' => $parts[1], | 
					
						
							|  |  |  | 					'host' => $profile['nisNetGroupUser_host' . $i][0], | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 					'user' => $this->uidOrig, | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 					'domain' => $profile['nisNetGroupUser_domain' . $i][0], | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 		usort($this->groups, array($this, 'sortTriple')); | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Returns a list of possible PDF entries for this account. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param array $pdfKeys list of PDF keys that are included in document | 
					
						
							|  |  |  | 	 * @return list of PDF entries (array(<PDF key> => <PDF lines>)) | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	function get_pdfEntries($pdfKeys) { | 
					
						
							|  |  |  | 		$return = array(); | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 		$pdfTable = new PDFTable(); | 
					
						
							|  |  |  | 		$pdfRow = new PDFTableRow(); | 
					
						
							|  |  |  | 		$pdfRow->cells[] = new PDFTableCell(_('Group'), '25%', null, true); | 
					
						
							|  |  |  | 		$pdfRow->cells[] = new PDFTableCell(_('Host name'), '25%', null, true); | 
					
						
							|  |  |  | 		$pdfRow->cells[] = new PDFTableCell(_('Domain name'), '25%', null, true); | 
					
						
							|  |  |  | 		$pdfTable->rows[] = $pdfRow; | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 		foreach ($this->groups as $group) { | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 			$pdfRow = new PDFTableRow(); | 
					
						
							|  |  |  | 			$pdfRow->cells[] = new PDFTableCell($group['name'], '25%'); | 
					
						
							|  |  |  | 			$pdfRow->cells[] = new PDFTableCell($group['host'], '25%'); | 
					
						
							|  |  |  | 			$pdfRow->cells[] = new PDFTableCell($group['domain'], '25%'); | 
					
						
							|  |  |  | 			$pdfTable->rows[] = $pdfRow; | 
					
						
							| 
									
										
										
										
											2015-05-25 17:44:51 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 		$this->addPDFTable($return, 'memberships', $pdfTable); | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		return $return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	* In this function the LDAP account is built up. | 
					
						
							|  |  |  | 	* | 
					
						
							|  |  |  | 	* @param array $rawAccounts list of hash arrays (name => value) from user input | 
					
						
							|  |  |  | 	* @param array $ids list of IDs for column position (e.g. "posixAccount_uid" => 5) | 
					
						
							|  |  |  | 	* @param array $partialAccounts list of hash arrays (name => value) which are later added to LDAP | 
					
						
							|  |  |  | 	* @param array $selectedModules list of selected account modules | 
					
						
							|  |  |  | 	* @return array list of error messages if any | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	function build_uploadAccounts($rawAccounts, $ids, &$partialAccounts, $selectedModules) { | 
					
						
							|  |  |  | 		$errors = array(); | 
					
						
							|  |  |  | 		// get list of existing group of names
 | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 		$groups = $this->findGroups(); | 
					
						
							|  |  |  | 		$groupNames = array(); | 
					
						
							|  |  |  | 		foreach ($groups as $group) { | 
					
						
							|  |  |  | 			$groupNames[] = $group['cn'][0]; | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		// check input
 | 
					
						
							|  |  |  | 		for ($i = 0; $i < sizeof($rawAccounts); $i++) { | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 			// group names
 | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 			if (!empty($rawAccounts[$i][$ids['nisNetGroup_memberships']])) { | 
					
						
							|  |  |  | 				$triples = preg_split('/,[ ]*/', $rawAccounts[$i][$ids['nisNetGroup_memberships']]); | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 				foreach ($triples as $triple) { | 
					
						
							|  |  |  | 					$parts = explode('#', $triple); | 
					
						
							|  |  |  | 					if (!in_array($parts[0], $groupNames)) { | 
					
						
							|  |  |  | 						$errors[] = array('ERROR', _('Unable to find group in LDAP.'), $parts[0]); | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return $errors; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	* This function executes one post upload action. | 
					
						
							|  |  |  | 	* | 
					
						
							|  |  |  | 	* @param array $data array containing one account in each element | 
					
						
							|  |  |  | 	* @param array $ids array(<column_name> => <column number>) | 
					
						
							|  |  |  | 	* @param array $failed list of accounts which were not created successfully | 
					
						
							|  |  |  | 	* @param array $temp variable to store temporary data between two post actions | 
					
						
							|  |  |  | 	* @param array $accounts list of LDAP entries | 
					
						
							|  |  |  | 	* @return array current status | 
					
						
							|  |  |  | 	* <br> array ( | 
					
						
							|  |  |  | 	* <br>  'status' => 'finished' | 'inProgress' | 
					
						
							|  |  |  | 	* <br>  'progress' => 0..100 | 
					
						
							|  |  |  | 	* <br>  'errors' => array (<array of parameters for StatusMessage>) | 
					
						
							|  |  |  | 	* <br> ) | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	function doUploadPostActions(&$data, $ids, $failed, &$temp, &$accounts) { | 
					
						
							|  |  |  | 		if (!checkIfWriteAccessIsAllowed($this->get_scope())) { | 
					
						
							|  |  |  | 			die(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		// on first call generate list of LDAP operations
 | 
					
						
							|  |  |  | 		if (!isset($temp['counter'])) { | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 			$temp['groups'] = array(); | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 			$temp['counter'] = 0; | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 			// get list of existing groups
 | 
					
						
							|  |  |  | 			$groupList = $this->findGroups(); | 
					
						
							|  |  |  | 			$groupMap = array(); | 
					
						
							|  |  |  | 			foreach ($groupList as $group) { | 
					
						
							|  |  |  | 				$groupMap[$group['cn'][0]] = $group['dn']; | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			for ($i = 0; $i < sizeof($data); $i++) { | 
					
						
							|  |  |  | 				if (in_array($i, $failed)) continue; // ignore failed accounts
 | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 				if (empty($accounts[$i]['uid'])) { | 
					
						
							|  |  |  | 					continue; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				$uid = $accounts[$i]['uid']; | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 				if (!empty($data[$i][$ids['nisNetGroup_memberships']])) { | 
					
						
							|  |  |  | 					$triples = preg_split('/,[ ]*/', $data[$i][$ids['nisNetGroup_memberships']]); | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 					foreach ($triples as $triple) { | 
					
						
							|  |  |  | 						$parts = explode('#', $triple); | 
					
						
							|  |  |  | 						$group = $parts[0]; | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 						$temp['groups'][$groupMap[$group]][] = $this->buildNetGroupTripleFromUploadValue($parts, $uid); | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 			$temp['groupDNs'] = array_keys($temp['groups']); | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 			return array( | 
					
						
							|  |  |  | 				'status' => 'inProgress', | 
					
						
							|  |  |  | 				'progress' => 0, | 
					
						
							|  |  |  | 				'errors' => array() | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 		// add users to groups
 | 
					
						
							|  |  |  | 		elseif ($temp['counter'] < sizeof($temp['groupDNs'])) { | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 			$errors = array(); | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 			$dn = $temp['groupDNs'][$temp['counter']]; | 
					
						
							|  |  |  | 			$current = ldapGetDN($dn, array('nisnetgrouptriple')); | 
					
						
							|  |  |  | 			if (empty($current)) { | 
					
						
							|  |  |  | 				$errors[] = array('ERROR', sprintf(_('Was unable to modify attributes of DN: %s.'), $dn)); | 
					
						
							| 
									
										
										
										
											2015-12-22 19:43:55 +00:00
										 |  |  | 				$temp['counter']++; | 
					
						
							|  |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			$triples = empty($current['nisnetgrouptriple']) ? array() : $current['nisnetgrouptriple']; | 
					
						
							|  |  |  | 			$triples = array_merge($temp['groups'][$dn], $triples); | 
					
						
							|  |  |  | 			$triples = array_values(array_unique($triples)); | 
					
						
							|  |  |  | 			$attributes = array( | 
					
						
							|  |  |  | 				'nisnetgrouptriple' => $triples | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			$success = @ldap_mod_replace($_SESSION['ldap']->server(), $dn, $attributes); | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 			if (!$success) { | 
					
						
							|  |  |  | 				$errors[] = array( | 
					
						
							|  |  |  | 					"ERROR", | 
					
						
							|  |  |  | 					_("LAM was unable to modify group memberships for group: %s"), | 
					
						
							|  |  |  | 					getDefaultLDAPErrorString($_SESSION['ldap']->server()), | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 					array($dn) | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 				); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$temp['counter']++; | 
					
						
							|  |  |  | 			return array ( | 
					
						
							|  |  |  | 				'status' => 'inProgress', | 
					
						
							| 
									
										
										
										
											2015-05-25 18:37:58 +00:00
										 |  |  | 				'progress' => ($temp['counter'] * 100) / sizeof($temp['groupDNs']), | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 				'errors' => $errors | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		// all modifications are done
 | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			return array ( | 
					
						
							|  |  |  | 				'status' => 'finished', | 
					
						
							|  |  |  | 				'progress' => 100, | 
					
						
							|  |  |  | 				'errors' => array() | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Creates a netgroup triple from the input value of file upload. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param array $value upload value (e.g. array(group1, host, domain)) | 
					
						
							|  |  |  | 	 * @param String $uid own uid | 
					
						
							|  |  |  | 	 * @return String netgroup triple | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	protected function buildNetGroupTripleFromUploadValue($value, $uid) { | 
					
						
							|  |  |  | 		$host = empty($value[1]) ? '' : $value[1]; | 
					
						
							|  |  |  | 		$domain = empty($value[2]) ? '' : $value[2]; | 
					
						
							|  |  |  | 		return '(' . $host . ',' . $uid . ',' . $domain . ')'; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Finds all existing LDAP NIS net groups. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @return array groups array(array(cn => array(), dn => '', nisnetgrouptriple => array())) | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 	protected function findGroups() { | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		if ($this->groupCache != null) { | 
					
						
							|  |  |  | 			return $this->groupCache; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$return = array(); | 
					
						
							|  |  |  | 		$types = array('netgroup'); | 
					
						
							|  |  |  | 		$typeSettings = $_SESSION['config']->get_typeSettings(); | 
					
						
							|  |  |  | 		if (sizeof($types) > 0) { | 
					
						
							|  |  |  | 			foreach ($types as $type) { | 
					
						
							|  |  |  | 				$filter = '(objectClass=nisNetgroup)'; | 
					
						
							|  |  |  | 				if (!empty($typeSettings['filter_' . $type])) { | 
					
						
							|  |  |  | 					$typeFilter = $typeSettings['filter_' . $type]; | 
					
						
							|  |  |  | 					if (strpos($typeFilter, '(') !== 0) { | 
					
						
							|  |  |  | 						$typeFilter = '(' . $typeFilter . ')'; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					$filter = '(&' . $filter . $typeFilter . ')'; | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 				$results = searchLDAPByFilter($filter, array('cn', 'dn', 'nisnetgrouptriple'), array($type)); | 
					
						
							|  |  |  | 				for ($i = 0; $i < sizeof($results); $i++) { | 
					
						
							|  |  |  | 					if (isset($results[$i]['cn'][0]) && isset($results[$i]['dn'])) { | 
					
						
							|  |  |  | 						$return[] = $results[$i]; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$this->groupCache = $return; | 
					
						
							|  |  |  | 		return $return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 	 * Sorts NIS netgroup triples by group, host, user and domain. | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 	 * | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 	 * @param array $first first array | 
					
						
							|  |  |  | 	 * @param array $second second array | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 	protected function sortTriple($first, $second) { | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		if ($first['name'] != $second['name']) { | 
					
						
							|  |  |  | 			return strnatcasecmp($first['name'], $second['name']); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		elseif ($first['host'] != $second['host']) { | 
					
						
							|  |  |  | 			return strnatcasecmp($first['host'], $second['host']); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-01-09 19:20:57 +00:00
										 |  |  | 		elseif ($first['user'] != $second['user']) { | 
					
						
							|  |  |  | 			return strnatcasecmp($first['user'], $second['user']); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | 		return strnatcasecmp($first['domain'], $second['domain']); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-11 09:50:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-25 09:32:34 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ?>
 |