Prevent from adding delegation for the same user many times (Bifrost#T20383)

This commit is contained in:
Aleksander Machniak 2016-12-28 10:12:23 +01:00
parent bfa8ff2a67
commit f67df88238
3 changed files with 28 additions and 21 deletions

View file

@ -350,15 +350,15 @@ class kolab_delegation extends rcube_plugin
// Delegate delete // Delegate delete
if ($this->rc->action == 'plugin.delegation-delete') { if ($this->rc->action == 'plugin.delegation-delete') {
$id = rcube_utils::get_input_value('id', rcube_utils::INPUT_GPC); $id = rcube_utils::get_input_value('id', rcube_utils::INPUT_GPC);
$success = $engine->delegate_delete($id, (bool) rcube_utils::get_input_value('acl', rcube_utils::INPUT_GPC)); $error = $engine->delegate_delete($id, (bool) rcube_utils::get_input_value('acl', rcube_utils::INPUT_GPC));
if ($success) { if (!$error) {
$this->rc->output->show_message($this->gettext('deletesuccess'), 'confirmation'); $this->rc->output->show_message($this->gettext('deletesuccess'), 'confirmation');
$this->rc->output->command('plugin.delegate_save_complete', array('deleted' => $id)); $this->rc->output->command('plugin.delegate_save_complete', array('deleted' => $id));
} }
else { else {
$this->rc->output->show_message($this->gettext('deleteerror'), 'error'); $this->rc->output->show_message($this->gettext($error), 'error');
} }
} }
// Delegate add/update // Delegate add/update
@ -369,23 +369,23 @@ class kolab_delegation extends rcube_plugin
// update // update
if ($id) { if ($id) {
$delegate = $engine->delegate_get($id); $delegate = $engine->delegate_get($id);
$success = $engine->delegate_acl_update($delegate['uid'], $acl); $error = $engine->delegate_acl_update($delegate['uid'], $acl);
if ($success) { if (!$error) {
$this->rc->output->show_message($this->gettext('updatesuccess'), 'confirmation'); $this->rc->output->show_message($this->gettext('updatesuccess'), 'confirmation');
$this->rc->output->command('plugin.delegate_save_complete', array('updated' => $id)); $this->rc->output->command('plugin.delegate_save_complete', array('updated' => $id));
} }
else { else {
$this->rc->output->show_message($this->gettext('updateerror'), 'error'); $this->rc->output->show_message($this->gettext($error), 'error');
} }
} }
// new // new
else { else {
$login = rcube_utils::get_input_value('newid', rcube_utils::INPUT_GPC); $login = rcube_utils::get_input_value('newid', rcube_utils::INPUT_GPC);
$delegate = $engine->delegate_get_by_name($login); $delegate = $engine->delegate_get_by_name($login);
$success = $engine->delegate_add($delegate, $acl); $error = $engine->delegate_add($delegate, $acl);
if ($success) { if (!$error) {
$this->rc->output->show_message($this->gettext('createsuccess'), 'confirmation'); $this->rc->output->show_message($this->gettext('createsuccess'), 'confirmation');
$this->rc->output->command('plugin.delegate_save_complete', array( $this->rc->output->command('plugin.delegate_save_complete', array(
'created' => $delegate['ID'], 'created' => $delegate['ID'],
@ -393,7 +393,7 @@ class kolab_delegation extends rcube_plugin
)); ));
} }
else { else {
$this->rc->output->show_message($this->gettext('createerror'), 'error'); $this->rc->output->show_message($this->gettext($error), 'error');
} }
} }
} }

View file

@ -54,6 +54,8 @@ class kolab_delegation_engine
* *
* @param string|array $delegate Delegate DN (encoded) or delegate data (result of delegate_get()) * @param string|array $delegate Delegate DN (encoded) or delegate data (result of delegate_get())
* @param array $acl List of folder->right map * @param array $acl List of folder->right map
*
* @return string On error returns an error label, on success returns null
*/ */
public function delegate_add($delegate, $acl) public function delegate_add($delegate, $acl)
{ {
@ -63,18 +65,20 @@ class kolab_delegation_engine
$dn = $delegate['ID']; $dn = $delegate['ID'];
if (empty($delegate) || empty($dn)) { if (empty($delegate) || empty($dn)) {
return false; return 'createerror';
} }
$list = $this->list_delegates(); $list = $this->list_delegates();
// add delegate to the list
$list = array_keys((array)$list); $list = array_keys((array)$list);
$list = array_filter($list); $list = array_filter($list);
if (!in_array($dn, $list)) {
$list[] = $dn; if (in_array($dn, $list)) {
return 'delegationexisterror';
} }
$list = array_map(array('kolab_auth_ldap', 'dn_decode'), $list);
// add delegate to the list
$list[] = $dn;
$list = array_map(array('kolab_auth_ldap', 'dn_decode'), $list);
// update user record // update user record
$result = $this->user_update_delegates($list); $result = $this->user_update_delegates($list);
@ -84,7 +88,7 @@ class kolab_delegation_engine
$this->delegate_acl_update($delegate['uid'], $acl); $this->delegate_acl_update($delegate['uid'], $acl);
} }
return $result; return $result ? null : 'createerror';
} }
/** /**
@ -93,6 +97,8 @@ class kolab_delegation_engine
* @param string $uid Delegate authentication identifier * @param string $uid Delegate authentication identifier
* @param array $acl List of folder->right map * @param array $acl List of folder->right map
* @param bool $update Update (remove) old rights * @param bool $update Update (remove) old rights
*
* @return string On error returns an error label, on success returns null
*/ */
public function delegate_acl_update($uid, $acl, $update = false) public function delegate_acl_update($uid, $acl, $update = false)
{ {
@ -119,8 +125,6 @@ class kolab_delegation_engine
$storage->delete_acl($folder_name, $uid); $storage->delete_acl($folder_name, $uid);
} }
} }
return true;
} }
/** /**
@ -128,6 +132,8 @@ class kolab_delegation_engine
* *
* @param string $dn Delegate DN (encoded) * @param string $dn Delegate DN (encoded)
* @param bool $acl_del Enable ACL deletion on delegator folders * @param bool $acl_del Enable ACL deletion on delegator folders
*
* @return string On error returns an error label, on success returns null
*/ */
public function delegate_delete($dn, $acl_del = false) public function delegate_delete($dn, $acl_del = false)
{ {
@ -136,7 +142,7 @@ class kolab_delegation_engine
$user = $this->user(); $user = $this->user();
if (empty($delegate) || !isset($list[$dn])) { if (empty($delegate) || !isset($list[$dn])) {
return false; return 'deleteerror';
} }
// remove delegate from the list // remove delegate from the list
@ -153,7 +159,7 @@ class kolab_delegation_engine
$this->delegate_acl_update($delegate['uid'], array(), true); $this->delegate_acl_update($delegate['uid'], array(), true);
} }
return $result; return $result ? null : 'deleteerror';
} }
/** /**

View file

@ -35,6 +35,7 @@ $labels['updatesuccess'] = 'The delegate was successfully updated.';
$labels['updateerror'] = 'Could not update delegate.'; $labels['updateerror'] = 'Could not update delegate.';
$labels['createsuccess'] = 'The delegate was successfully added.'; $labels['createsuccess'] = 'The delegate was successfully added.';
$labels['createerror'] = 'Could not add delegate.'; $labels['createerror'] = 'Could not add delegate.';
$labels['delegationexisterror'] = 'Specified user already is your delegate.';
$labels['arialabeldelegatedelete'] = 'Delegate deletion dialog'; $labels['arialabeldelegatedelete'] = 'Delegate deletion dialog';
$labels['arialabeldelegateform'] = 'Delegate properties form'; $labels['arialabeldelegateform'] = 'Delegate properties form';