Files
server/usr/share/psa-horde/imp/lib/Basic/Folders.php
2026-01-07 20:52:11 +01:00

466 lines
16 KiB
PHP

<?php
/**
* Copyright 2000-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.horde.org/licenses/gpl.
*
* @category Horde
* @copyright 2000-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
/**
* Folder tree display for basic view.
*
* @author Anil Madhavapeddy <avsm@horde.org>
* @author Chuck Hagenbuch <chuck@horde.org>
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @copyright 2000-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
class IMP_Basic_Folders extends IMP_Basic_Base
{
/**
*/
protected function _init()
{
global $injector, $notification, $page_output, $prefs, $registry, $session;
/* Redirect back to the mailbox if folder use is not allowed. */
$imp_imap = $injector->getInstance('IMP_Factory_Imap')->create();
if (!$imp_imap->access(IMP_Imap::ACCESS_FOLDERS)) {
$notification->push(_("The folder view is not enabled."), 'horde.error');
Horde::url('mailbox', true)->redirect();
}
/* Decide whether or not to show all the unsubscribed mailboxes. */
$subscribe = $prefs->getValue('subscribe');
$showAll = (!$subscribe || $session->get('imp', 'showunsub'));
$page_output->addScriptFile('hordecore.js', 'horde');
$page_output->addScriptFile('folders.js');
/* Get the base URL for this page. */
$folders_url = self::url()->setRaw(true);
/* These JS defines are required by all sub-pages. */
$page_output->addInlineJsVars(array(
'ImpFolders.folders_url' => strval($folders_url),
'ImpFolders.text' => array(
'download1' => _("All messages in the following mailbox(es) will be downloaded into one MBOX file:"),
'download2' => _("This may take some time. Are you sure you want to continue?"),
'oneselect' => _("Only one mailbox should be selected for this action."),
'rename1' => _("You are renaming the mailbox:"),
'rename2' => _("Please enter the new name:"),
'select' => _("Please select a mailbox before you perform this action."),
'subfolder1' => _("You are creating a subfolder to"),
'subfolder2' => _("Please enter the name of the new mailbox:"),
'toplevel' => _("You are creating a top-level mailbox.") . "\n" . _("Please enter the name of the new mailbox:")
)
));
/* Initialize the IMP_Ftree object. */
$ftree = $injector->getInstance('IMP_Ftree');
/* $mbox_list entries are urlencoded. */
$mbox_list = isset($this->vars->mbox_list)
? IMP_Mailbox::formFrom($this->vars->mbox_list)
: array();
/* META refresh time (might be altered by actionID). */
$refresh_time = $prefs->getValue('refresh_time');
/* Set up the master View object. */
$view = new Horde_View(array(
'templatePath' => IMP_TEMPLATES . '/basic/folders'
));
$view->addHelper('FormTag');
$view->addHelper('Tag');
$token = $session->getToken();
$view->token = $token;
/* Run through the action handlers. */
if ($this->vars->actionID) {
try {
$session->checkToken($this->vars->token);
} catch (Horde_Exception $e) {
$notification->push($e);
$this->vars->actionID = null;
}
}
switch ($this->vars->actionID) {
case 'expand_all_folders':
$ftree->expandAll();
break;
case 'collapse_all_folders':
$ftree->collapseAll();
break;
case 'rebuild_tree':
$ftree->init();
break;
case 'expunge_mbox':
if (!empty($mbox_list)) {
$injector->getInstance('IMP_Message')->expungeMailbox(array_fill_keys($mbox_list, null));
}
break;
case 'delete_mbox':
foreach ($mbox_list as $val) {
$val->delete();
}
break;
case 'download_mbox':
case 'download_mbox_zip':
IMP_Contents_View::downloadUrl('mbox', array(
'actionID' => 'download_mbox',
'mbox_list' => $this->vars->mbox_list,
'type' => ($this->vars->actionID == 'download_mbox') ? 'mbox' : 'mboxzip'
))->redirect();
exit;
case 'import_mbox':
if ($this->vars->import_mbox) {
try {
$notification->push($injector->getInstance('IMP_Mbox_Import')->import($this->vars->import_mbox, 'mbox_upload'), 'horde.success');
} catch (Horde_Exception $e) {
$notification->push($e);
}
$this->vars->actionID = null;
} else {
$refresh_time = null;
}
break;
case 'create_mbox':
if (isset($this->vars->new_mailbox)) {
try {
$parent = empty($mbox_list)
? IMP_Mailbox::get(IMP_Ftree::BASE_ELT)
: $mbox_list[0];
$new_mbox = $parent->createMailboxName($this->vars->new_mailbox);
if ($new_mbox->exists) {
$notification->push(sprintf(_("Mailbox \"%s\" already exists."), $new_mbox->display), 'horde.warning');
} else {
$new_mbox->create();
}
} catch (Horde_Exception $e) {
$notification->push($e);
}
}
break;
case 'rename_mbox':
// $old_names may be URL encoded.
$old_names = array_map('trim', explode("\n", $this->vars->old_names));
$new_names = array_map('trim', explode("\n", $this->vars->new_names));
$iMax = count($new_names);
if (!empty($new_names) &&
!empty($old_names) &&
($iMax == count($old_names))) {
for ($i = 0; $i < $iMax; ++$i) {
$old_name = IMP_Mailbox::formFrom($old_names[$i]);
$old_ns = $old_name->namespace_info;
$new = trim($new_names[$i], $old_ns->delimiter);
/* If this is a personal namespace, then anything goes as
* far as the input. Just append the personal namespace to
* it. */
if (($old_ns->type === $old_ns::NS_PERSONAL) ||
(strlen($old_ns->name) &&
(stripos($new_names[$i], $old_ns->name) !== 0))) {
$new = $old_ns->name . $new;
}
$old_name->rename($new);
}
}
break;
case 'subscribe_mbox':
case 'unsubscribe_mbox':
if (empty($mbox_list)) {
$notification->push(_("No mailboxes were specified"), 'horde.message');
} else {
foreach ($mbox_list as $val) {
$val->subscribe($this->vars->actionID == 'subscribe_mbox');
}
}
break;
case 'toggle_subscribed_view':
if ($subscribe) {
$showAll = !$showAll;
$session->set('imp', 'showunsub', $showAll);
}
break;
case 'poll_mbox':
if (!empty($mbox_list)) {
$ftree->poll->addPollList($mbox_list);
}
break;
case 'nopoll_mbox':
if (!empty($mbox_list)) {
$ftree->poll->removePollList($mbox_list);
}
break;
case 'empty_mbox':
if (!empty($mbox_list)) {
$injector->getInstance('IMP_Message')->emptyMailbox($mbox_list);
}
break;
case 'mark_mbox_seen':
case 'mark_mbox_unseen':
if (!empty($mbox_list)) {
$injector->getInstance('IMP_Message')->flagAllInMailbox(array('\\seen'), $mbox_list, ($this->vars->actionID == 'mark_mbox_seen'));
}
break;
case 'delete_mbox_confirm':
case 'empty_mbox_confirm':
if (!empty($mbox_list)) {
$loop = array();
foreach ($mbox_list as $val) {
switch ($this->vars->actionID) {
case 'delete_mbox_confirm':
if (!$val->access_deletembox) {
$notification->push(sprintf(_("The mailbox \"%s\" may not be deleted."), $val->display), 'horde.error');
continue 2;
}
break;
case 'empty_mbox_confirm':
if (!$val->access_empty) {
$notification->push(sprintf(_("The mailbox \"%s\" may not be emptied."), $val->display), 'horde.error');
continue 2;
}
break;
}
try {
$elt_info = $imp_imap->status($val, Horde_Imap_Client::STATUS_MESSAGES);
} catch (IMP_Imap_Exception $e) {
$elt_info = null;
}
$data = array(
'name' => $val->display,
'msgs' => $elt_info ? $elt_info['messages'] : 0,
'val' => $val->form_to
);
$loop[] = $data;
}
if (!count($loop)) {
break;
}
$page_output->addScriptFile('stripe.js', 'horde');
$this->title = _("Folder Actions - Confirmation");
$v = clone $view;
if ($this->vars->actionID == 'delete_mbox_confirm') {
$v->actionID = 'delete_mbox';
$v->delete = true;
} elseif ($this->vars->actionID == 'empty_mbox_confirm') {
$v->actionID = 'empty_mbox';
$v->empty = true;
}
$v->mboxes = $loop;
$v->folders_url = $folders_url;
$this->output = $v->render('folders_confirm');
return;
}
break;
case 'mbox_size':
if (!empty($mbox_list)) {
$loop = array();
$sum = 0;
foreach ($mbox_list as $val) {
$size = $val->size_raw;
$data = array(
'name' => $val->display,
'size' => $val->size,
'sort' => $size
);
$sum += $size;
$loop[] = $data;
}
/* Prepare the topbar. */
$injector->getInstance('Horde_View_Topbar')->subinfo =
$injector->getInstance('IMP_View_Subinfo')->render();
$v = clone $view;
$v->folders_url = $folders_url;
$v->mboxes = $loop;
$v->mboxes_sum = sprintf(_("%.2fMB"), $sum / (1024 * 1024));
$page_output->addScriptFile('stripe.js', 'horde');
$page_output->addScriptFile('tables.js', 'horde');
$this->title = _("Mailbox Sizes");
$this->output = $v->render('folders_size');
return;
}
break;
case 'search':
if (!empty($mbox_list)) {
IMP_Basic_Search::url()->add(array(
'mailbox_list' => IMP_Mailbox::formTo($mbox_list),
'subfolder' => 1
))->redirect();
}
break;
}
$this->title = _("Folder Navigator");
$folders_url->add('token', $token);
/* Prepare the topbar. */
$injector->getInstance('Horde_View_Topbar')->subinfo =
$injector->getInstance('IMP_View_Subinfo')->render();
if ($session->get('imp', 'file_upload') &&
($this->vars->actionID == 'import_mbox')) {
/* Prepare import template. */
$v = clone $view;
$v->folders_url = $folders_url;
$v->import_mbox = $mbox_list[0];
$this->output = $v->render('import');
return;
}
/* Prepare the header template. */
$head_view = clone $view;
$head_view->folders_url = $folders_url;
/* Prepare the actions template. */
$actions = clone $view;
$actions->addHelper('Horde_Core_View_Helper_Accesskey');
$actions->addHelper('Horde_Core_View_Helper_Help');
$actions->id = 0;
$actions->refresh = Horde::widget(array(
'title' => _("_Refresh"),
'url' => $folders_url->copy()
));
$actions->create_mbox = ($imp_imap->access(IMP_Imap::ACCESS_CREATEMBOX) && $imp_imap->access(IMP_Imap::ACCESS_CREATEMBOX_MAX));
if ($prefs->getValue('subscribe')) {
$actions->subscribe = true;
$subToggleText = $showAll
? _("Hide Unsubscribed")
: _("Show All");
$actions->toggle_subscribe = Horde::widget(array(
'url' => $folders_url->copy()->add(array(
'actionID' => 'toggle_subscribed_view',
'token' => $token
)),
'title' => $subToggleText,
'nocheck' => true
));
}
$actions->nav_poll = (!$prefs->isLocked('nav_poll') && !$prefs->getValue('nav_poll_all'));
$actions->notrash = !$prefs->getValue('use_trash');
$actions->file_upload = $session->get('imp', 'file_upload');
$actions->expand_all = Horde::widget(array(
'url' => $folders_url->copy()->add(array(
'actionID' => 'expand_all_folders',
'token' => $token
)),
'title' => _("Expand All"),
'nocheck' => true
));
$actions->collapse_all = Horde::widget(array(
'url' => $folders_url->copy()->add(array(
'actionID' => 'collapse_all_folders',
'token' => $token
)),
'title' => _("Collapse All"),
'nocheck' => true
));
/* Build the folder tree. */
$iterator = new IMP_Ftree_IteratorFilter($ftree);
$iterator->add(array($iterator::REMOTE, $iterator::VFOLDER));
if ($showAll) {
$ftree->loadUnsubscribed();
$iterator->remove($iterator::UNSUB);
}
$tree = $ftree->createTree('imp_folders', array(
'checkbox' => true,
'editvfolder' => true,
'iterator' => $iterator,
'poll_info' => true
));
$displayNames = $fullNames = array();
foreach ($iterator as $val) {
$mbox_ob = $val->mbox_ob;
$tmp = $displayNames[] = $mbox_ob->display;
$tmp2 = $mbox_ob->display_notranslate;
if ($tmp != $tmp2) {
$fullNames[strval($val)] = $tmp2;
}
}
$page_output->addInlineJsVars(array(
'ImpFolders.ajax' => $registry->getServiceLink('ajax', 'imp')->url,
'ImpFolders.displayNames' => $displayNames,
'ImpFolders.fullNames' => $fullNames,
'-ImpFolders.mbox_expand' => intval($prefs->getValue('nav_expanded') == 2)
));
$page_output->metaRefresh($refresh_time, $this->url());
Horde::startBuffer();
$tree->renderTree();
$this->output = $head_view->render('head') .
$actions->render('actions') .
Horde::endBuffer();
if (count($tree) > 10) {
$actions->id = 1;
$this->output .= $actions->render('actions');
}
/* No need for extra template - close out the tags here. */
$this->output .= '</form>';
}
/**
*/
static public function url(array $opts = array())
{
return Horde::url('basic.php')->add('page', 'folders');
}
}