public function updatePermissions($perms)
{
$type = $this->get('type');
if ($type == 'matrix') {
/* Array of permission types to iterate through. */
$perm_types = Horde_Perms::getPermsArray();
}
foreach ($perms as $perm_class => $perm_values) {
switch ($perm_class) {
case 'default':
case 'guest':
case 'creator':
if ($type == 'matrix') {
foreach ($perm_types as $val => $label) {
if (!empty($perm_values[$val])) {
$this->setPerm($perm_class, $val, false);
} else {
$this->unsetPerm($perm_class, $val, false);
}
}
} elseif (!empty($perm_values)) {
$this->setPerm($perm_class, $perm_values, false);
} else {
$this->unsetPerm($perm_class, null, false);
}
break;
case 'u':
case 'g':
$permId = array('class' => $perm_class == 'u' ? 'users' : 'groups');
/* Figure out what names that are stored in this permission
* class have not been submitted for an update, ie. have been
* removed entirely. */
$current_names = isset($this->data[$permId['class']]) ? array_keys($this->data[$permId['class']]) : array();
$updated_names = array_keys($perm_values);
$removed_names = array_diff($current_names, $updated_names);
/* Remove any names that have been completely unset. */
foreach ($removed_names as $name) {
unset($this->data[$permId['class']][$name]);
}
/* If nothing to actually update finish with this case. */
if (is_null($perm_values)) {
continue;
}
/* Loop through the names and update permissions for each. */
// @todo for Horde 6 - allow integer 0 values?
foreach ($perm_values as $name => $name_values) {
$permId['name'] = $name;
if ($type == 'matrix') {
foreach ($perm_types as $val => $label) {
if ($name_values[$val] === '0' || !empty($name_values[$val])) {
$this->setPerm($permId, $val, false);
} else {
$this->unsetPerm($permId, $val, false);
}
}
} elseif ($name_values === '0' || !empty($name_values)) {
$this->setPerm($permId, $name_values, false);
} else {
$this->unsetPerm($permId, null, false);
}
}
break;
}
}
}