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
if ($this->rc->action == 'plugin.delegation-delete') {
$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));
$id = rcube_utils::get_input_value('id', 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->command('plugin.delegate_save_complete', array('deleted' => $id));
}
else {
$this->rc->output->show_message($this->gettext('deleteerror'), 'error');
$this->rc->output->show_message($this->gettext($error), 'error');
}
}
// Delegate add/update
@ -369,23 +369,23 @@ class kolab_delegation extends rcube_plugin
// update
if ($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->command('plugin.delegate_save_complete', array('updated' => $id));
}
else {
$this->rc->output->show_message($this->gettext('updateerror'), 'error');
$this->rc->output->show_message($this->gettext($error), 'error');
}
}
// new
else {
$login = rcube_utils::get_input_value('newid', rcube_utils::INPUT_GPC);
$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->command('plugin.delegate_save_complete', array(
'created' => $delegate['ID'],
@ -393,7 +393,7 @@ class kolab_delegation extends rcube_plugin
));
}
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 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)
{
@ -63,18 +65,20 @@ class kolab_delegation_engine
$dn = $delegate['ID'];
if (empty($delegate) || empty($dn)) {
return false;
return 'createerror';
}
$list = $this->list_delegates();
// add delegate to the list
$list = array_keys((array)$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
$result = $this->user_update_delegates($list);
@ -84,7 +88,7 @@ class kolab_delegation_engine
$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 array $acl List of folder->right map
* @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)
{
@ -119,8 +125,6 @@ class kolab_delegation_engine
$storage->delete_acl($folder_name, $uid);
}
}
return true;
}
/**
@ -128,6 +132,8 @@ class kolab_delegation_engine
*
* @param string $dn Delegate DN (encoded)
* @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)
{
@ -136,7 +142,7 @@ class kolab_delegation_engine
$user = $this->user();
if (empty($delegate) || !isset($list[$dn])) {
return false;
return 'deleteerror';
}
// remove delegate from the list
@ -153,7 +159,7 @@ class kolab_delegation_engine
$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['createsuccess'] = 'The delegate was successfully added.';
$labels['createerror'] = 'Could not add delegate.';
$labels['delegationexisterror'] = 'Specified user already is your delegate.';
$labels['arialabeldelegatedelete'] = 'Delegate deletion dialog';
$labels['arialabeldelegateform'] = 'Delegate properties form';