/**
* Reads a submitted permissions form and updates the share permissions.
*
* @param Horde_Share_Object|Kronolith_Resource_Base $share The share to update.
*
* @return array A list of error messages.
* @throws Kronolith_Exception
*/
public static function readPermsForm($share)
{
$auth = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Auth')->create();
$perm = $share->getPermission();
$errors = array();
if ($GLOBALS['conf']['share']['notify']) {
$identity = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Identity')->create();
$mail = new Horde_Mime_Mail(array('From' => $identity->getDefaultFromAddress(true), 'User-Agent' => 'Kronolith ' . $GLOBALS['registry']->getVersion()));
$image = self::getImagePart('big_share.png');
$view = new Horde_View(array('templatePath' => KRONOLITH_TEMPLATES . '/share'));
new Horde_View_Helper_Text($view);
$view->identity = $identity;
$view->calendar = $share->get('name');
$view->imageId = $image->getContentId();
}
// Process owner and owner permissions.
if (!$share instanceof Kronolith_Resource_Base) {
$old_owner = $share->get('owner');
$new_owner_backend = Horde_Util::getFormData('owner_select', Horde_Util::getFormData('owner_input', $old_owner));
$new_owner = $GLOBALS['registry']->convertUsername($new_owner_backend, true);
// Only set new owner if this isn't a system calendar, and the
// owner actually changed and the new owner is set at all.
if (!is_null($old_owner) && $old_owner !== $new_owner && !empty($new_owner)) {
if ($old_owner != $GLOBALS['registry']->getAuth() && !$GLOBALS['registry']->isAdmin()) {
$errors[] = _("Only the owner or system administrator may change ownership or owner permissions for a share");
} elseif ($auth->hasCapability('list') && !$auth->exists($new_owner_backend)) {
$errors[] = sprintf(_("The user \"%s\" does not exist."), $new_owner_backend);
} else {
$share->set('owner', $new_owner);
$share->save();
if ($GLOBALS['conf']['share']['notify']) {
$view->ownerChange = true;
$multipart = self::buildMimeMessage($view, 'notification', $image);
$to = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Identity')->create($new_owner)->getDefaultFromAddress(true);
$mail->addHeader('Subject', _("Ownership assignment"));
$mail->addHeader('To', $to);
$mail->setBasePart($multipart);
$mail->send($GLOBALS['injector']->getInstance('Horde_Mail'));
$view->ownerChange = false;
}
}
}
}
if ($GLOBALS['conf']['share']['notify']) {
if ($GLOBALS['conf']['share']['hidden']) {
$view->subscribe = Horde::url('calendars/subscribe.php', true)->add('calendar', $share->getName());
}
$multipart = self::buildMimeMessage($view, 'notification', $image);
}
if ($GLOBALS['registry']->isAdmin() || !empty($GLOBALS['conf']['share']['world'])) {
// Process default permissions.
if (Horde_Util::getFormData('default_show')) {
$perm->addDefaultPermission(Horde_Perms::SHOW, false);
} else {
$perm->removeDefaultPermission(Horde_Perms::SHOW, false);
}
if (Horde_Util::getFormData('default_read')) {
$perm->addDefaultPermission(Horde_Perms::READ, false);
} else {
$perm->removeDefaultPermission(Horde_Perms::READ, false);
}
if (Horde_Util::getFormData('default_edit')) {
$perm->addDefaultPermission(Horde_Perms::EDIT, false);
} else {
$perm->removeDefaultPermission(Horde_Perms::EDIT, false);
}
if (Horde_Util::getFormData('default_delete')) {
$perm->addDefaultPermission(Horde_Perms::DELETE, false);
} else {
$perm->removeDefaultPermission(Horde_Perms::DELETE, false);
}
if (Horde_Util::getFormData('default_delegate')) {
$perm->addDefaultPermission(self::PERMS_DELEGATE, false);
} else {
$perm->removeDefaultPermission(self::PERMS_DELEGATE, false);
}
// Process guest permissions.
if (Horde_Util::getFormData('guest_show')) {
$perm->addGuestPermission(Horde_Perms::SHOW, false);
} else {
$perm->removeGuestPermission(Horde_Perms::SHOW, false);
}
if (Horde_Util::getFormData('guest_read')) {
$perm->addGuestPermission(Horde_Perms::READ, false);
} else {
$perm->removeGuestPermission(Horde_Perms::READ, false);
}
if (Horde_Util::getFormData('guest_edit')) {
$perm->addGuestPermission(Horde_Perms::EDIT, false);
} else {
$perm->removeGuestPermission(Horde_Perms::EDIT, false);
}
if (Horde_Util::getFormData('guest_delete')) {
$perm->addGuestPermission(Horde_Perms::DELETE, false);
} else {
$perm->removeGuestPermission(Horde_Perms::DELETE, false);
}
if (Horde_Util::getFormData('guest_delegate')) {
$perm->addGuestPermission(self::PERMS_DELEGATE, false);
} else {
$perm->removeGuestPermission(self::PERMS_DELEGATE, false);
}
}
// Process creator permissions.
if (Horde_Util::getFormData('creator_show')) {
$perm->addCreatorPermission(Horde_Perms::SHOW, false);
} else {
$perm->removeCreatorPermission(Horde_Perms::SHOW, false);
}
if (Horde_Util::getFormData('creator_read')) {
$perm->addCreatorPermission(Horde_Perms::READ, false);
} else {
$perm->removeCreatorPermission(Horde_Perms::READ, false);
}
if (Horde_Util::getFormData('creator_edit')) {
$perm->addCreatorPermission(Horde_Perms::EDIT, false);
} else {
$perm->removeCreatorPermission(Horde_Perms::EDIT, false);
}
if (Horde_Util::getFormData('creator_delete')) {
$perm->addCreatorPermission(Horde_Perms::DELETE, false);
} else {
$perm->removeCreatorPermission(Horde_Perms::DELETE, false);
}
if (Horde_Util::getFormData('creator_delegate')) {
$perm->addCreatorPermission(self::PERMS_DELEGATE, false);
} else {
$perm->removeCreatorPermission(self::PERMS_DELEGATE, false);
}
// Process user permissions.
$u_names = Horde_Util::getFormData('u_names');
$u_show = Horde_Util::getFormData('u_show');
$u_read = Horde_Util::getFormData('u_read');
$u_edit = Horde_Util::getFormData('u_edit');
$u_delete = Horde_Util::getFormData('u_delete');
$u_delegate = Horde_Util::getFormData('u_delegate');
$current = $perm->getUserPermissions();
if ($GLOBALS['conf']['share']['notify']) {
$mail->addHeader('Subject', _("Access permissions"));
}
$perm->removeUserPermission(null, null, false);
foreach ($u_names as $key => $user_backend) {
// Apply backend hooks
$user = $GLOBALS['registry']->convertUsername($user_backend, true);
// If the user is empty, or we've already set permissions
// via the owner_ options, don't do anything here.
if (empty($user) || $user == $new_owner) {
continue;
}
if ($auth->hasCapability('list') && !$auth->exists($user_backend)) {
$errors[] = sprintf(_("The user \"%s\" does not exist."), $user_backend);
continue;
}
$has_perms = false;
if (!empty($u_show[$key])) {
$perm->addUserPermission($user, Horde_Perms::SHOW, false);
$has_perms = true;
}
if (!empty($u_read[$key])) {
$perm->addUserPermission($user, Horde_Perms::READ, false);
$has_perms = true;
}
if (!empty($u_edit[$key])) {
$perm->addUserPermission($user, Horde_Perms::EDIT, false);
$has_perms = true;
}
if (!empty($u_delete[$key])) {
$perm->addUserPermission($user, Horde_Perms::DELETE, false);
$has_perms = true;
}
if (!empty($u_delegate[$key])) {
$perm->addUserPermission($user, self::PERMS_DELEGATE, false);
$has_perms = true;
}
// Notify users that have been added.
if ($GLOBALS['conf']['share']['notify'] && !isset($current[$user]) && $has_perms) {
$to = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Identity')->create($user)->getDefaultFromAddress(true);
$mail->addHeader('To', $to);
$mail->setBasePart($multipart);
$mail->send($GLOBALS['injector']->getInstance('Horde_Mail'));
}
}
// Process group permissions.
$g_names = Horde_Util::getFormData('g_names');
$g_show = Horde_Util::getFormData('g_show');
$g_read = Horde_Util::getFormData('g_read');
$g_edit = Horde_Util::getFormData('g_edit');
$g_delete = Horde_Util::getFormData('g_delete');
$g_delegate = Horde_Util::getFormData('g_delegate');
$current = $perm->getGroupPermissions();
$perm->removeGroupPermission(null, null, false);
foreach ($g_names as $key => $group) {
if (empty($group)) {
continue;
}
$has_perms = false;
if (!empty($g_show[$key])) {
$perm->addGroupPermission($group, Horde_Perms::SHOW, false);
$has_perms = true;
}
if (!empty($g_read[$key])) {
$perm->addGroupPermission($group, Horde_Perms::READ, false);
$has_perms = true;
}
if (!empty($g_edit[$key])) {
$perm->addGroupPermission($group, Horde_Perms::EDIT, false);
$has_perms = true;
}
if (!empty($g_delete[$key])) {
$perm->addGroupPermission($group, Horde_Perms::DELETE, false);
$has_perms = true;
}
if (!empty($g_delegate[$key])) {
$perm->addGroupPermission($group, self::PERMS_DELEGATE, false);
$has_perms = true;
}
// Notify users that have been added.
if ($GLOBALS['conf']['share']['notify'] && !isset($current[$group]) && $has_perms) {
$groupOb = $GLOBALS['injector']->getInstance('Horde_Group')->getData($group);
if (!empty($groupOb['email'])) {
$mail->addHeader('To', $groupOb['name'] . ' <' . $groupOb['email'] . '>');
$mail->setBasePart($multipart);
$mail->send($GLOBALS['injector']->getInstance('Horde_Mail'));
}
}
}
try {
$share->setPermission($perm);
} catch (Horde_Share_Exception $e) {
throw new Kronolith_Exception($e);
}
return $errors;
}