support to add recipient to existing alias entries

This commit is contained in:
Roland Gruber 2014-02-22 14:12:12 +00:00
parent 3e4b2c9db4
commit c0a6eed8bc
1 changed files with 104 additions and 12 deletions

View File

@ -37,12 +37,14 @@ class nisMailAliasUser extends baseModule {
/** alias cache */ /** alias cache */
private $cachedAliasList = null; private $cachedAliasList = null;
/** recipient entries to delete */ /** recipient entries to delete (list of arrays: dn => attributes) */
private $receipientsToDelete = array(); private $recipientsToDelete = array();
/** complete alias entries to delete */ /** complete alias entries to delete */
private $aliasesToDelete = array(); private $aliasesToDelete = array();
/** new alias entries (list of arrays: dn => attributes) */ /** new alias entries (list of arrays: dn => attributes) */
private $aliasesToAdd = array(); private $aliasesToAdd = array();
/** alias entries to extend with new recipients (list of arrays: dn => recipients) */
private $recipientsToAdd = array();
/** /**
* Returns meta data that is interpreted by parent class * Returns meta data that is interpreted by parent class
@ -87,6 +89,10 @@ class nisMailAliasUser extends baseModule {
"Headline" => _("Alias name"), 'attr' => 'cn', "Headline" => _("Alias name"), 'attr' => 'cn',
"Text" => _("Name of new alias entry.") "Text" => _("Name of new alias entry.")
), ),
'aliasNames' => array(
"Headline" => _("Alias names"), 'attr' => 'cn',
"Text" => _("Select one or more alias entries from the list to add the recipient.")
),
'hiddenOptions' => array( 'hiddenOptions' => array(
"Headline" => _("Hidden options"), "Headline" => _("Hidden options"),
"Text" => _("The selected options will not be managed inside LAM. You can use this to reduce the number of displayed input fields.") "Text" => _("The selected options will not be managed inside LAM. You can use this to reduce the number of displayed input fields.")
@ -114,6 +120,10 @@ class nisMailAliasUser extends baseModule {
*/ */
function display_html_attributes() { function display_html_attributes() {
$return = new htmlTable(); $return = new htmlTable();
if (!$this->isMailAliasTypeActive()) {
$return->addElement(new htmlStatusMessage('ERROR', _('Please active the mail aliases type for this server profile.')));
return $return;
}
$aliases = $this->getMailAliasList(); $aliases = $this->getMailAliasList();
$count = sizeof($aliases); $count = sizeof($aliases);
$userName = $this->getUserName(); $userName = $this->getUserName();
@ -128,7 +138,7 @@ class nisMailAliasUser extends baseModule {
$dn = $aliases[$i]['dn']; $dn = $aliases[$i]['dn'];
$members = $aliases[$i]['rfc822mailmember']; $members = $aliases[$i]['rfc822mailmember'];
if (in_array($userName, $members) if (in_array($userName, $members)
&& (!isset($this->receipientsToDelete[$dn]) || !in_array($userName, $this->receipientsToDelete[$dn])) && (!isset($this->recipientsToDelete[$dn]) || !in_array($userName, $this->recipientsToDelete[$dn]))
&& !in_array($dn, $this->aliasesToDelete)) { && !in_array($dn, $this->aliasesToDelete)) {
$userTable->addElement(new htmlOutputText($aliases[$i]['cn'][0])); $userTable->addElement(new htmlOutputText($aliases[$i]['cn'][0]));
$buttonGroup = new htmlGroup(); $buttonGroup = new htmlGroup();
@ -165,7 +175,7 @@ class nisMailAliasUser extends baseModule {
$dn = $aliases[$i]['dn']; $dn = $aliases[$i]['dn'];
$members = $aliases[$i]['rfc822mailmember']; $members = $aliases[$i]['rfc822mailmember'];
if (in_array($mails[$m], $members) if (in_array($mails[$m], $members)
&& (!isset($this->receipientsToDelete[$dn]) || !in_array($mails[$m], $this->receipientsToDelete[$dn])) && (!isset($this->recipientsToDelete[$dn]) || !in_array($mails[$m], $this->recipientsToDelete[$dn]))
&& !in_array($dn, $this->aliasesToDelete)) { && !in_array($dn, $this->aliasesToDelete)) {
$found = true; $found = true;
$mailTable->addSpace('5px'); $mailTable->addSpace('5px');
@ -202,6 +212,9 @@ class nisMailAliasUser extends baseModule {
*/ */
function process_attributes() { function process_attributes() {
$errors = array(); $errors = array();
if (!$this->isMailAliasTypeActive()) {
return $errors;
}
$mails = $this->getMailAddresses(); $mails = $this->getMailAddresses();
foreach ($_POST as $key => $value) { foreach ($_POST as $key => $value) {
if (strpos($key, 'rem_') === 0) { if (strpos($key, 'rem_') === 0) {
@ -235,11 +248,28 @@ class nisMailAliasUser extends baseModule {
* @param String $dn alias DN * @param String $dn alias DN
*/ */
private function removeRecipient($recipient, $dn) { private function removeRecipient($recipient, $dn) {
if (!isset($this->aliasesToAdd[$dn])) { if (!isset($this->aliasesToAdd[$dn])) { // no new entry update existing
// no new entry update existing if (isset($this->recipientsToAdd[$dn]) && in_array($recipient, $this->recipientsToAdd[$dn])) {
$this->receipientsToDelete[$dn][] = $this->getUserName(); // undo adding of recipient
if (sizeof($this->recipientsToAdd[$dn]) == 1) {
// only one entry as marked for adding, remove whole entry
unset($this->recipientsToAdd[$dn]);
}
else {
$this->recipientsToAdd[$dn] = array_values(array_delete(array($recipient), $this->recipientsToAdd[$dn]));
}
}
else {
// mark for removal
$this->recipientsToDelete[$dn][] = $recipient;
}
foreach ($this->cachedAliasList as $index => $attrs) {
if ($dn == $attrs['dn']) {
$this->cachedAliasList[$index]['rfc822mailmember'] = array_values(array_delete(array($recipient), $this->cachedAliasList[$index]['rfc822mailmember']));
}
}
} }
else { else { // new entry
if (sizeof($this->aliasesToAdd[$dn]['rfc822mailmember']) == 1) { if (sizeof($this->aliasesToAdd[$dn]['rfc822mailmember']) == 1) {
// single recipient in new entry, do not create new entry at all // single recipient in new entry, do not create new entry at all
unset($this->aliasesToAdd[$dn]); unset($this->aliasesToAdd[$dn]);
@ -251,10 +281,10 @@ class nisMailAliasUser extends baseModule {
} }
} }
else { else {
$this->aliasesToAdd[$dn]['rfc822mailmember'] = array_delete(array($this->getUserName()), $this->aliasesToAdd[$dn]['rfc822mailmember']); $this->aliasesToAdd[$dn]['rfc822mailmember'] = array_values(array_delete(array($recipient), $this->aliasesToAdd[$dn]['rfc822mailmember']));
foreach ($this->cachedAliasList as $index => &$attrs) { foreach ($this->cachedAliasList as $index => &$attrs) {
if ($dn == $attrs['dn']) { if ($dn == $attrs['dn']) {
$attrs['rfc822mailmember'] = array_delete(array($this->getUserName()), $attrs['rfc822mailmember']); $attrs['rfc822mailmember'] = array_values(array_delete(array($recipient), $attrs['rfc822mailmember']));
} }
} }
} }
@ -280,6 +310,12 @@ class nisMailAliasUser extends baseModule {
} }
} }
} }
if (isset($this->recipientsToAdd[$dn])) {
unset($this->recipientsToAdd[$dn]);
}
if (isset($this->recipientsToDelete[$dn])) {
unset($this->recipientsToDelete[$dn]);
}
} }
/** /**
@ -319,13 +355,34 @@ class nisMailAliasUser extends baseModule {
$return->addElement(new htmlTableExtendedSelect('new_ou', $ous, array(), _('Suffix'), 'suffix'), true); $return->addElement(new htmlTableExtendedSelect('new_ou', $ous, array(), _('Suffix'), 'suffix'), true);
$newAliasCn = empty($_POST['new_cn']) ? '' : $_POST['new_cn']; $newAliasCn = empty($_POST['new_cn']) ? '' : $_POST['new_cn'];
$return->addElement(new htmlTableExtendedInputField(_('Alias name'), 'new_cn', $newAliasCn, 'newAlias'), true); $return->addElement(new htmlTableExtendedInputField(_('Alias name'), 'new_cn', $newAliasCn, 'newAlias'), true);
$return->addElement(new htmlEqualWidth(array('new_ou', 'new_cn')));
$return->addVerticalSpace('5px'); $return->addVerticalSpace('5px');
$addButton = new htmlAccountPageButton(get_class($this), 'attributes', 'create', _('Create')); $addButton = new htmlAccountPageButton(get_class($this), 'attributes', 'create', _('Create'));
$addButton->setIconClass('createButton'); $addButton->setIconClass('createButton');
$addButton->colspan = 5; $addButton->colspan = 5;
$return->addElement($addButton, true); $return->addElement($addButton, true);
$return->addVerticalSpace('20px');
// add to existing alias
$return->addElement(new htmlSubTitle(_('Add to existing alias')), true);
$aliasesToAdd = array();
foreach ($aliases as $index => $attrs) {
if (!empty($attrs['rfc822mailmember']) && in_array($recipient, $attrs['rfc822mailmember'])) {
continue;
}
$aliasesToAdd[$attrs['cn'][0]] = $index;
}
$aliasSelect = new htmlTableExtendedSelect('ex_cn', $aliasesToAdd, array(), _('Alias names'), 'aliasNames', 20);
$aliasSelect->setHasDescriptiveElements(true);
$aliasSelect->setMultiSelect(true);
$return->addElement($aliasSelect, true);
$return->addVerticalSpace('5px');
$addButton = new htmlAccountPageButton(get_class($this), 'attributes', 'recipient', _('Add'));
$addButton->setIconClass('createButton');
$addButton->colspan = 5;
$return->addElement($addButton, true);
$return->addElement(new htmlEqualWidth(array('new_ou', 'new_cn', 'ex_cn')));
return $return; return $return;
} }
@ -368,6 +425,20 @@ class nisMailAliasUser extends baseModule {
} }
} }
} }
// add recipient to existing entries
if (isset($_POST['form_subpage_' . get_class($this) . '_attributes_recipient'])) {
$selectedAliases = $_POST['ex_cn'];
foreach ($selectedAliases as $index) {
$dn = $this->cachedAliasList[$index]['dn'];
$this->cachedAliasList[$index]['rfc822mailmember'][] = $_POST['recipient'];
if (isset($this->aliasesToAdd[$dn])) {
$this->aliasesToAdd[$dn]['rfc822mailmember'][] = $_POST['recipient'];
}
else {
$this->recipientsToAdd[$dn][] = $_POST['recipient'];
}
}
}
return $errors; return $errors;
} }
@ -397,7 +468,7 @@ class nisMailAliasUser extends baseModule {
} }
} }
// delete recipient entries // delete recipient entries
foreach ($this->receipientsToDelete as $dn => $recipients) { foreach ($this->recipientsToDelete as $dn => $recipients) {
$success = @ldap_mod_del($_SESSION['ldap']->server(), $dn, array('rfc822mailmember' => $recipients)); $success = @ldap_mod_del($_SESSION['ldap']->server(), $dn, array('rfc822mailmember' => $recipients));
if (!$success) { if (!$success) {
logNewMessage(LOG_ERR, '[' . $ldapUser .'] Unable to remove recipients ' . implode(', ', $recipients) . ' from ' . $dn . ' (' . ldap_error($_SESSION['ldap']->server()) . ').'); logNewMessage(LOG_ERR, '[' . $ldapUser .'] Unable to remove recipients ' . implode(', ', $recipients) . ' from ' . $dn . ' (' . ldap_error($_SESSION['ldap']->server()) . ').');
@ -419,6 +490,17 @@ class nisMailAliasUser extends baseModule {
logNewMessage(LOG_NOTICE, '[' . $ldapUser .'] Added mail alias with recipients ' . implode(', ', $attrs['rfc822mailmember']) . ' and DN ' . $dn); logNewMessage(LOG_NOTICE, '[' . $ldapUser .'] Added mail alias with recipients ' . implode(', ', $attrs['rfc822mailmember']) . ' and DN ' . $dn);
} }
} }
// add recipients
foreach ($this->recipientsToAdd as $dn => $recipients) {
$success = @ldap_mod_add($_SESSION['ldap']->server(), $dn, array('rfc822mailmember' => $recipients));
if (!$success) {
logNewMessage(LOG_ERR, '[' . $ldapUser .'] Unable to add recipients ' . implode(', ', $recipients) . ' to ' . $dn . ' (' . ldap_error($_SESSION['ldap']->server()) . ').');
$errors[] = array('ERROR', sprintf(_('Was unable to add attributes to DN: %s.'), $dn), getDefaultLDAPErrorString($_SESSION['ldap']->server()));
}
else {
logNewMessage(LOG_NOTICE, '[' . $ldapUser .'] Added recipients ' . implode(', ', $recipients) . ' to ' . $dn);
}
}
return $errors; return $errors;
} }
@ -531,6 +613,16 @@ class nisMailAliasUser extends baseModule {
return null; return null;
} }
/**
* Returns if the mail alias type is active. Otherwise, aliases cannot be managed.
*
* @return boolean is active
*/
private function isMailAliasTypeActive() {
$activeTypes = $_SESSION['config']->get_ActiveTypes();
return in_array('mailAlias', $activeTypes);
}
} }