support msSFU30DomainInfo
This commit is contained in:
parent
6702d53f26
commit
69db640b85
|
@ -6,6 +6,7 @@ June 2015
|
|||
- User list: support to filter by account status
|
||||
- Lamdaemon: update group of home directory if user's primary group changes
|
||||
- Personal: allow to add ou=addressbook subentry for users (RFE 117)
|
||||
- Unix: support auto-UID/GID with msSFU30DomainInfo
|
||||
- LAM Pro:
|
||||
-> Password Self Reset: added 389 Directory Server schema file
|
||||
-> Support for groupOfMembers (RFE 121)
|
||||
|
|
|
@ -129,6 +129,7 @@ class posixAccount extends baseModule implements passwordService {
|
|||
$this->messages['cn'][0] = array('ERROR', _('Common name'), _('Please enter a valid common name!'));
|
||||
$this->messages['cn'][1] = array('ERROR', _('Account %s:') . ' posixAccount_cn', _('Please enter a valid common name!'));
|
||||
$this->messages['sambaIDPoolDN'][0] = array('ERROR', _('Samba ID pool DN'), _('This is not a valid DN!'));
|
||||
$this->messages['windowsIDPoolDN'][0] = array('ERROR', _('Windows domain info DN'), _('This is not a valid DN!'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -211,14 +212,30 @@ class posixAccount extends baseModule implements passwordService {
|
|||
// configuration options
|
||||
$configUserContainer = new htmlTable();
|
||||
$configUserContainer->addElement(new htmlSubTitle(_("Users")), true);
|
||||
$uidGeneratorSelect = new htmlTableExtendedSelect('posixAccount_uidGeneratorUsers', array(_('Fixed range') => 'range', _('Samba ID pool') => 'sambaPool'), array('range'), _('UID generator'), 'uidGenerator');
|
||||
$generatorOptions = array(
|
||||
_('Fixed range') => 'range',
|
||||
_('Samba ID pool') => 'sambaPool',
|
||||
_('Windows domain info') => 'windowsDomain'
|
||||
);
|
||||
$uidGeneratorSelect = new htmlTableExtendedSelect('posixAccount_uidGeneratorUsers', $generatorOptions, array('range'), _('UID generator'), 'uidGenerator');
|
||||
$uidGeneratorSelect->setHasDescriptiveElements(true);
|
||||
$uidGeneratorSelect->setTableRowsToHide(array('range' => array('posixAccount_sambaIDPoolDNUsers'), 'sambaPool' => array('posixAccount_minUID', 'posixAccount_maxUID')));
|
||||
$uidGeneratorSelect->setTableRowsToShow(array('range' => array('posixAccount_minUID', 'posixAccount_maxUID'), 'sambaPool' => array('posixAccount_sambaIDPoolDNUsers')));
|
||||
$uidGeneratorSelect->setTableRowsToHide(array(
|
||||
'range' => array('posixAccount_sambaIDPoolDNUsers', 'posixAccount_windowsIDPoolDNUsers'),
|
||||
'sambaPool' => array('posixAccount_minUID', 'posixAccount_maxUID', 'posixAccount_windowsIDPoolDNUsers'),
|
||||
'windowsDomain' => array('posixAccount_minUID', 'posixAccount_maxUID', 'posixAccount_sambaIDPoolDNUsers')
|
||||
));
|
||||
$uidGeneratorSelect->setTableRowsToShow(array(
|
||||
'range' => array('posixAccount_minUID', 'posixAccount_maxUID'),
|
||||
'sambaPool' => array('posixAccount_sambaIDPoolDNUsers'),
|
||||
'windowsDomain' => array('posixAccount_windowsIDPoolDNUsers')
|
||||
));
|
||||
$configUserContainer->addElement($uidGeneratorSelect, true);
|
||||
$uidUsersGeneratorDN = new htmlTableExtendedInputField(_('Samba ID pool DN'), 'posixAccount_sambaIDPoolDNUsers', null, 'sambaIDPoolDN');
|
||||
$uidUsersGeneratorDN->setRequired(true);
|
||||
$configUserContainer->addElement($uidUsersGeneratorDN, true);
|
||||
$uidUsersGeneratorWinDN = new htmlTableExtendedInputField(_('Windows domain info DN'), 'posixAccount_windowsIDPoolDNUsers', null, 'windowsIDPoolDN');
|
||||
$uidUsersGeneratorWinDN->setRequired(true);
|
||||
$configUserContainer->addElement($uidUsersGeneratorWinDN, true);
|
||||
$minUid = new htmlTableExtendedInputField(_('Minimum UID number'), 'posixAccount_minUID', null, 'minMaxUser');
|
||||
$minUid->setRequired(true);
|
||||
$configUserContainer->addElement($minUid, true);
|
||||
|
@ -229,14 +246,25 @@ class posixAccount extends baseModule implements passwordService {
|
|||
$return['config_options']['user'] = $configUserContainer;
|
||||
$configHostContainer = new htmlTable();
|
||||
$configHostContainer->addElement(new htmlSubTitle(_("Hosts")), true);
|
||||
$uidHostGeneratorSelect = new htmlTableExtendedSelect('posixAccount_uidGeneratorHosts', array(_('Fixed range') => 'range', _('Samba ID pool') => 'sambaPool'), array('range'), _('UID generator'), 'uidGenerator');
|
||||
$uidHostGeneratorSelect = new htmlTableExtendedSelect('posixAccount_uidGeneratorHosts', $generatorOptions, array('range'), _('UID generator'), 'uidGenerator');
|
||||
$uidHostGeneratorSelect->setHasDescriptiveElements(true);
|
||||
$uidHostGeneratorSelect->setTableRowsToHide(array('range' => array('posixAccount_sambaIDPoolDNHosts'), 'sambaPool' => array('posixAccount_minMachine', 'posixAccount_maxMachine')));
|
||||
$uidHostGeneratorSelect->setTableRowsToShow(array('range' => array('posixAccount_minMachine', 'posixAccount_maxMachine'), 'sambaPool' => array('posixAccount_sambaIDPoolDNHosts')));
|
||||
$uidHostGeneratorSelect->setTableRowsToHide(array(
|
||||
'range' => array('posixAccount_sambaIDPoolDNHosts', 'posixAccount_windowsIDPoolDNHosts'),
|
||||
'sambaPool' => array('posixAccount_minMachine', 'posixAccount_maxMachine', 'posixAccount_windowsIDPoolDNHosts'),
|
||||
'windowsDomain' => array('posixAccount_minMachine', 'posixAccount_maxMachine', 'posixAccount_sambaIDPoolDNHosts')
|
||||
));
|
||||
$uidHostGeneratorSelect->setTableRowsToShow(array(
|
||||
'range' => array('posixAccount_minMachine', 'posixAccount_maxMachine'),
|
||||
'sambaPool' => array('posixAccount_sambaIDPoolDNHosts'),
|
||||
'windowsDomain' => array('posixAccount_windowsIDPoolDNHosts')
|
||||
));
|
||||
$configHostContainer->addElement($uidHostGeneratorSelect, true);
|
||||
$uidHostsGeneratorDN = new htmlTableExtendedInputField(_('Samba ID pool DN'), 'posixAccount_sambaIDPoolDNHosts', null, 'sambaIDPoolDN');
|
||||
$uidHostsGeneratorDN->setRequired(true);
|
||||
$configHostContainer->addElement($uidHostsGeneratorDN, true);
|
||||
$uidHostsGeneratorWinDN = new htmlTableExtendedInputField(_('Windows domain info DN'), 'posixAccount_windowsIDPoolDNHosts', null, 'windowsIDPoolDN');
|
||||
$uidHostsGeneratorWinDN->setRequired(true);
|
||||
$configHostContainer->addElement($uidHostsGeneratorWinDN, true);
|
||||
$minUid = new htmlTableExtendedInputField(_('Minimum UID number'), 'posixAccount_minMachine', null, 'minMaxHost');
|
||||
$minUid->setRequired(true);
|
||||
$configHostContainer->addElement($minUid, true);
|
||||
|
@ -499,12 +527,16 @@ class posixAccount extends baseModule implements passwordService {
|
|||
),
|
||||
'uidGenerator' => array (
|
||||
"Headline" => _("UID generator"),
|
||||
"Text" => _("LAM will automatically suggest UID/GID numbers. You can either use a fixed range of numbers or an LDAP entry with object class \"sambaUnixIdPool\".")
|
||||
"Text" => _("LAM will automatically suggest UID/GID numbers. You can either use a fixed range of numbers or an LDAP entry with object class \"sambaUnixIdPool\" or \"msSFU30DomainInfo\".")
|
||||
),
|
||||
'sambaIDPoolDN' => array (
|
||||
"Headline" => _("Samba ID pool DN"),
|
||||
"Text" => _("Please enter the DN of the LDAP entry with object class \"sambaUnixIdPool\".")
|
||||
),
|
||||
'windowsIDPoolDN' => array (
|
||||
"Headline" => _("Windows domain info DN"),
|
||||
"Text" => _("Please enter the DN of the LDAP entry with object class \"msSFU30DomainInfo\".")
|
||||
),
|
||||
'user' => array(
|
||||
'uid' => array(
|
||||
"Headline" => _("User name"), 'attr' => 'uid',
|
||||
|
@ -1195,12 +1227,12 @@ class posixAccount extends baseModule implements passwordService {
|
|||
// check manual ID
|
||||
if ($this->getAccountContainer()->isNewAccount || !isset($this->orig['uidNumber'][0]) || ($this->orig['uidNumber'][0] != $this->attributes['uidNumber'][0])) {
|
||||
// check range
|
||||
if (($this->get_scope() == 'user') && (!isset($this->moduleSettings['posixAccount_uidGeneratorUsers']) || ($this->moduleSettings['posixAccount_uidGeneratorUsers'][0] != 'sambaPool'))) {
|
||||
if (($this->get_scope() == 'user') && (!isset($this->moduleSettings['posixAccount_uidGeneratorUsers']) || ($this->moduleSettings['posixAccount_uidGeneratorUsers'][0] == 'range'))) {
|
||||
if (!is_numeric($this->attributes['uidNumber'][0]) || ($this->attributes['uidNumber'][0] < $minID) || ($this->attributes['uidNumber'][0] > $maxID)) {
|
||||
$errors[] = array('ERROR', _('ID-Number'), sprintf(_('Please enter a value between %s and %s!'), $minID, $maxID));
|
||||
}
|
||||
}
|
||||
if (($this->get_scope() == 'host') && (!isset($this->moduleSettings['posixAccount_uidGeneratorHosts']) || ($this->moduleSettings['posixAccount_uidGeneratorHosts'][0] != 'sambaPool'))) {
|
||||
if (($this->get_scope() == 'host') && (!isset($this->moduleSettings['posixAccount_uidGeneratorHosts']) || ($this->moduleSettings['posixAccount_uidGeneratorHosts'][0] == 'range'))) {
|
||||
if (!is_numeric($this->attributes['uidNumber'][0]) || ($this->attributes['uidNumber'][0] < $minID) || ($this->attributes['uidNumber'][0] > $maxID)) {
|
||||
$errors[] = array('ERROR', _('ID-Number'), sprintf(_('Please enter a value between %s and %s!'), $minID, $maxID));
|
||||
}
|
||||
|
@ -1963,11 +1995,16 @@ class posixAccount extends baseModule implements passwordService {
|
|||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
elseif ($options['posixAccount_uidGeneratorUsers'][0] == 'sambaPool') {
|
||||
if (!isset($options['posixAccount_sambaIDPoolDNUsers'][0]) || !get_preg($options['posixAccount_sambaIDPoolDNUsers'][0], 'dn')) {
|
||||
$return[] = $this->messages['sambaIDPoolDN'][0];
|
||||
}
|
||||
}
|
||||
elseif ($options['posixAccount_uidGeneratorUsers'][0] == 'windowsDomain') {
|
||||
if (!isset($options['posixAccount_windowsIDPoolDNUsers'][0]) || !get_preg($options['posixAccount_windowsIDPoolDNUsers'][0], 'dn')) {
|
||||
$return[] = $this->messages['windowsIDPoolDN'][0];
|
||||
}
|
||||
}
|
||||
}
|
||||
// host settings
|
||||
if (in_array('host', $scopes)) {
|
||||
|
@ -1986,11 +2023,16 @@ class posixAccount extends baseModule implements passwordService {
|
|||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
elseif ($options['posixAccount_uidGeneratorHosts'][0] == 'sambaPool') {
|
||||
if (!isset($options['posixAccount_sambaIDPoolDNHosts'][0]) || !get_preg($options['posixAccount_sambaIDPoolDNHosts'][0], 'dn')) {
|
||||
$return[] = $this->messages['sambaIDPoolDN'][0];
|
||||
}
|
||||
}
|
||||
elseif ($options['posixAccount_uidGeneratorHosts'][0] == 'windowsDomain') {
|
||||
if (!isset($options['posixAccount_windowsIDPoolDNHosts'][0]) || !get_preg($options['posixAccount_windowsIDPoolDNHosts'][0], 'dn')) {
|
||||
$return[] = $this->messages['windowsIDPoolDN'][0];
|
||||
}
|
||||
}
|
||||
}
|
||||
// check if user and host ranges overlap
|
||||
if (in_array('user', $scopes) && ($options['posixAccount_uidGeneratorUsers'][0] == 'range')
|
||||
|
@ -2497,6 +2539,13 @@ class posixAccount extends baseModule implements passwordService {
|
|||
if (($this->get_scope() == 'host') && isset($this->moduleSettings['posixAccount_uidGeneratorHosts']) && ($this->moduleSettings['posixAccount_uidGeneratorHosts'][0] == 'sambaPool')) {
|
||||
return $this->getNextSambaPoolUIDs($count, $errors);
|
||||
}
|
||||
// check if UIDs should be taken from domain info pool entry
|
||||
if (($this->get_scope() == 'user') && isset($this->moduleSettings['posixAccount_uidGeneratorUsers']) && ($this->moduleSettings['posixAccount_uidGeneratorUsers'][0] == 'windowsDomain')) {
|
||||
return $this->getNextDomainInfoUIDs($count, $errors);
|
||||
}
|
||||
if (($this->get_scope() == 'host') && isset($this->moduleSettings['posixAccount_uidGeneratorHosts']) && ($this->moduleSettings['posixAccount_uidGeneratorHosts'][0] == 'windowsDomain')) {
|
||||
return $this->getNextDomainInfoUIDs($count, $errors);
|
||||
}
|
||||
$ret = array();
|
||||
if ($this->get_scope() == "user") {
|
||||
$minID = intval($this->moduleSettings['posixAccount_minUID'][0]);
|
||||
|
@ -2582,6 +2631,39 @@ class posixAccount extends baseModule implements passwordService {
|
|||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the free UID numbers from a domain info entry in LDAP.
|
||||
*
|
||||
* @param integer $count number of needed free UIDs.
|
||||
* @param array $errors list of error messages where errors can be added
|
||||
* @return mixed null if no UIDs are free else an array of free UIDs
|
||||
*/
|
||||
private function getNextDomainInfoUIDs($count, &$errors) {
|
||||
if ($this->get_scope() == 'user') {
|
||||
$dn = $this->moduleSettings['posixAccount_windowsIDPoolDNUsers'][0];
|
||||
}
|
||||
else {
|
||||
$dn = $this->moduleSettings['posixAccount_windowsIDPoolDNHosts'][0];
|
||||
}
|
||||
$attrs = ldapGetDN($dn, array('msSFU30MaxUidNumber'));
|
||||
if (!empty($attrs['mssfu30maxuidnumber'][0])) {
|
||||
$newValue = $attrs['mssfu30maxuidnumber'][0] + $count;
|
||||
$ldapHandle = $_SESSION['ldap']->server();
|
||||
ldap_modify($ldapHandle, $dn, array('mssfu30maxuidnumber' => array($newValue)));
|
||||
logNewMessage(LOG_DEBUG, 'Updated domain info ' . $dn . ' with UID number ' . $newValue . ' and LDAP code ' . ldap_errno($ldapHandle));
|
||||
if (ldap_errno($ldapHandle) != 0) {
|
||||
logNewMessage(LOG_NOTICE, 'Updating domain info ' . $dn . ' with UID number ' . $newValue . ' failed. ' . ldap_error($ldapHandle));
|
||||
return null;
|
||||
}
|
||||
$result = array();
|
||||
for ($i = 0; $i < $count; $i++) {
|
||||
$result[] = $attrs['mssfu30maxuidnumber'][0] + $i;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the meta HTML code for each input field.
|
||||
* format: array(<field1> => array(<META HTML>), ...)
|
||||
|
|
Loading…
Reference in New Issue