/**
 * This should go in imap_mailbox.php
 * @param string $mailbox
 */
function handleAsSent($mailbox)
{
    global $handleAsSent_result;
    /* First check if this is the sent or draft folder. */
    $handleAsSent_result = isSentMailbox($mailbox) || isDraftMailbox($mailbox);
    /* Then check the result of the handleAsSent hook. */
    do_hook('check_handleAsSent_result', $mailbox);
    /* And return the result. */
    return $handleAsSent_result;
}
Exemple #2
0
/**
 * Defines special mailboxes: given a mailbox name, it checks if this is a
 * "special" one: INBOX, Trash, Sent or Draft.
 *
 * Since 1.2.5 function includes special_mailbox hook.<br>
 * Since 1.4.3 hook supports more than one plugin.
 * @param string $box mailbox name
 * @param boolean $include_subs (since 1.5.2 and 1.4.9) if true, subfolders of 
 *  system folders are special. if false, subfolders are not special mailboxes 
 *  unless they are tagged as special in 'special_mailbox' hook.
 * @return boolean
 * @since 1.2.3
 */
function isSpecialMailbox($box, $include_subs = true)
{
    $ret = strtolower($box) == 'inbox' || isTrashMailbox($box, $include_subs) || isSentMailbox($box, $include_subs) || isDraftMailbox($box, $include_subs);
    if (!$ret) {
        $ret = boolean_hook_function('special_mailbox', $box, 1);
    }
    return $ret;
}
function isSpecialMailbox($box)
{
    global $trash_folder, $sent_folder, $draft_folder, $move_to_trash, $move_to_sent, $save_as_draft;
    $ret = strtolower($box) == 'inbox' || isTrashMailbox($box) || isSentMailbox($box) || isDraftMailbox($box);
    if (!$ret) {
        $ret = do_hook_function('special_mailbox', $box);
    }
    return $ret;
}
/**
 * Fills mailbox object
 *
 * Some code fragments are present in 1.3.0 - 1.4.4.
 * @param array $mbx_ary
 * @param $mbxs
 * @param stream $imap_stream imap connection resource
 * @return object see mailboxes class
 * @since 1.5.0
 */
function sqimap_fill_mailbox_tree($mbx_ary, $mbxs = false, $imap_stream)
{
    global $data_dir, $username, $list_special_folders_first, $folder_prefix, $trash_folder, $sent_folder, $draft_folder, $move_to_trash, $move_to_sent, $save_as_draft, $delimiter, $imap_server_type;
    // $special_folders = array ('INBOX', $sent_folder, $draft_folder, $trash_folder);
    /* create virtual root node */
    $mailboxes = new mailboxes();
    $mailboxes->is_root = true;
    $trail_del = false;
    $start = 0;
    if (isset($folder_prefix) && $folder_prefix != '') {
        $start = substr_count($folder_prefix, $delimiter);
        if (strrpos($folder_prefix, $delimiter) == strlen($folder_prefix) - 1) {
            $mailboxes->mailboxname_full = substr($folder_prefix, 0, strlen($folder_prefix) - 1);
        } else {
            $mailboxes->mailboxname_full = $folder_prefix;
            $start++;
        }
        $mailboxes->mailboxname_sub = $mailboxes->mailboxname_full;
    } else {
        $start = 0;
    }
    $cnt = count($mbx_ary);
    for ($i = 0; $i < $cnt; $i++) {
        if ($mbx_ary[$i]['mbx'] != '') {
            $mbx = new mailboxes();
            $mailbox = $mbx_ary[$i]['mbx'];
            /*
             * Set the is_special flag if it concerned a special mailbox.
             * Used for displaying the special folders on top in the mailbox
             * tree displaying code.
             */
            $mbx->is_special |= $mbx->is_inbox = strtoupper($mailbox) == 'INBOX';
            $mbx->is_special |= $mbx->is_trash = isTrashMailbox($mailbox);
            $mbx->is_special |= $mbx->is_sent = isSentMailbox($mailbox);
            $mbx->is_special |= $mbx->is_draft = isDraftMailbox($mailbox);
            if (!$mbx->is_special) {
                $mbx->is_special = boolean_hook_function('special_mailbox', $mailbox, 1);
            }
            if (isset($mbx_ary[$i]['unseen'])) {
                $mbx->unseen = $mbx_ary[$i]['unseen'];
            }
            if (isset($mbx_ary[$i]['nummessages'])) {
                $mbx->total = $mbx_ary[$i]['nummessages'];
            }
            $mbx->is_noselect = $mbx_ary[$i]['noselect'];
            $mbx->is_noinferiors = $mbx_ary[$i]['noinferiors'];
            $r_del_pos = strrpos($mbx_ary[$i]['mbx'], $delimiter);
            if ($r_del_pos) {
                $mbx->mailboxname_sub = substr($mbx_ary[$i]['mbx'], $r_del_pos + 1);
            } else {
                /* mailbox is root folder */
                $mbx->mailboxname_sub = $mbx_ary[$i]['mbx'];
            }
            $mbx->mailboxname_full = $mbx_ary[$i]['mbx'];
            $mailboxes->addMbx($mbx, $delimiter, $start, $list_special_folders_first);
        }
    }
    sqimap_utf7_decode_mbx_tree($mailboxes);
    sqimap_get_status_mbx_tree($imap_stream, $mailboxes);
    return $mailboxes;
}
function sqimap_fill_mailbox_tree($mbx_ary, $mbxs = false, $imap_stream)
{
    global $data_dir, $username, $list_special_folders_first, $folder_prefix, $trash_folder, $sent_folder, $draft_folder, $move_to_trash, $move_to_sent, $save_as_draft, $delimiter, $imap_server_type;
    $special_folders = array('INBOX', $sent_folder, $draft_folder, $trash_folder);
    /* create virtual root node */
    $mailboxes = new mailboxes();
    $mailboxes->is_root = true;
    $trail_del = false;
    $start = 0;
    if (isset($folder_prefix) && $folder_prefix != '') {
        $start = substr_count($folder_prefix, $delimiter);
        if (strrpos($folder_prefix, $delimiter) == strlen($folder_prefix) - 1) {
            $trail_del = true;
            $mailboxes->mailboxname_full = substr($folder_prefix, 0, strlen($folder_prefix) - 1);
        } else {
            $mailboxes->mailboxname_full = $folder_prefix;
            $start++;
        }
        $mailboxes->mailboxname_sub = $mailboxes->mailboxname_full;
    } else {
        $start = 0;
    }
    $cnt = count($mbx_ary);
    for ($i = 0; $i < $cnt; $i++) {
        if ($mbx_ary[$i]['mbx'] != '') {
            $mbx = new mailboxes();
            $mailbox = $mbx_ary[$i]['mbx'];
            /*
                sent subfolders messes up using existing code as subfolders
                were marked, but the parents were ordered somewhere else in
                the list, despite having "special folders at top" option set.
                Need a better method than this.
            */
            /*
                        if ($mailbox == 'INBOX') {
                            $mbx->is_special = true;
                        } elseif (stristr($trash_folder , $mailbox)) {
                            $mbx->is_special = true;
                        } elseif (stristr($sent_folder , $mailbox)) {
                            $mbx->is_special = true;
                        } elseif (stristr($draft_folder , $mailbox)) {
                            $mbx->is_special = true;
                        }
            
                        switch ($mailbox) {
                            case 'INBOX':
                                $mbx->is_inbox = true;
                                $mbx->is_special = true;
                                $mbx_ary[$i]['noselect'] = false;
                                break;
                            case $trash_folder:
                                $mbx->is_trash = true;
                                $mbx->is_special = true;
                                break;
                            case $sent_folder:
                                $mbx->is_sent = true;
                                $mbx->is_special = true;
                                break;
                            case $draft_folder:
                                $mbx->is_draft = true;
                                $mbx->is_special = true;
                                break;
                        }
            */
            $mbx->is_special |= $mbx->is_inbox = strtoupper($mailbox) == 'INBOX';
            $mbx->is_special |= $mbx->is_trash = isTrashMailbox($mailbox);
            $mbx->is_special |= $mbx->is_sent = isSentMailbox($mailbox);
            $mbx->is_special |= $mbx->is_draft = isDraftMailbox($mailbox);
            if (!$mbx->is_special) {
                $mbx->is_special = boolean_hook_function('special_mailbox', $mailbox, 1);
            }
            if (isset($mbx_ary[$i]['unseen'])) {
                $mbx->unseen = $mbx_ary[$i]['unseen'];
            }
            if (isset($mbx_ary[$i]['nummessages'])) {
                $mbx->total = $mbx_ary[$i]['nummessages'];
            }
            $mbx->is_noselect = $mbx_ary[$i]['noselect'];
            $mbx->is_noinferiors = $mbx_ary[$i]['noinferiors'];
            $r_del_pos = strrpos($mbx_ary[$i]['mbx'], $delimiter);
            if ($r_del_pos) {
                $mbx->mailboxname_sub = substr($mbx_ary[$i]['mbx'], $r_del_pos + 1);
            } else {
                /* mailbox is root folder */
                $mbx->mailboxname_sub = $mbx_ary[$i]['mbx'];
            }
            $mbx->mailboxname_full = $mbx_ary[$i]['mbx'];
            $mailboxes->addMbx($mbx, $delimiter, $start, $list_special_folders_first);
        }
    }
    sqimap_utf7_decode_mbx_tree($mailboxes);
    sqimap_get_status_mbx_tree($imap_stream, $mailboxes);
    return $mailboxes;
}
Exemple #6
0
/**
 * Format message toolbar
 *
 * @param array   $aMailbox      Current mailbox information array
 * @param int     $passed_id     UID of current message
 * @param int     $passed_ent_id Id of entity within message
 * @param object  $message       Current message object
 * @param void    $removedVar    This parameter is no longer used, but remains
 *                               so as not to break this function's prototype
 *                               (OPTIONAL)
 * @param boolean $nav_on_top    When TRUE, the menubar is being constructed
 *                               for use at the top of the page, otherwise it
 *                               will be used for page bottom (OPTIONAL;
 *                               default = TRUE)
 */
function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removedVar = FALSE, $nav_on_top = TRUE)
{
    global $base_uri, $draft_folder, $where, $what, $sort, $startMessage, $PHP_SELF, $save_as_draft, $enable_forward_as_attachment, $imapConnection, $lastTargetMailbox, $delete_prev_next_display, $show_copy_buttons, $compose_new_win, $compose_width, $compose_height, $oTemplate;
    //FIXME cleanup argument list, use $aMailbox where possible
    $mailbox = $aMailbox['NAME'];
    $urlMailbox = urlencode($mailbox);
    // Create Prev & Next links
    // Handle nested entities first (i.e. Mime Attach parts)
    $prev_href = $next_href = $up_href = $del_href = $del_prev_href = $del_next_href = '';
    $msg_list_href = $search_href = $view_msg_href = '';
    if (isset($passed_ent_id) && $passed_ent_id) {
        // code for navigating through attached message/rfc822 messages
        $url = set_url_var($PHP_SELF, 'passed_ent_id', 0);
        $entities = array();
        $entity_count = array();
        $c = 0;
        foreach ($message->parent->entities as $ent) {
            if ($ent->type0 == 'message' && $ent->type1 == 'rfc822') {
                $c++;
                $entity_count[$c] = $ent->entity_id;
                $entities[$ent->entity_id] = $c;
            }
        }
        if (isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] > 1) {
            $prev_ent_id = $entity_count[$entities[$passed_ent_id] - 1];
            $prev_href = set_url_var($PHP_SELF, 'passed_ent_id', $prev_ent_id);
        }
        if (isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] < $c) {
            $next_ent_id = $entity_count[$entities[$passed_ent_id] + 1];
            $next_href = set_url_var($PHP_SELF, 'passed_ent_id', $next_ent_id);
        }
        $par_ent_id = $message->parent->entity_id;
        if ($par_ent_id) {
            $par_ent_id = substr($par_ent_id, 0, -2);
            if ($par_ent_id != 0) {
                $up_href = set_url_var($PHP_SELF, 'passed_ent_id', $par_ent_id);
            }
        }
        $view_msg_href = $url;
        // Prev/Next links for regular messages
    } else {
        if (true) {
            //!(isset($where) && isset($what)) ) {
            $prev = findPreviousMessage($aMailbox['UIDSET'][$what], $passed_id);
            $next = findNextMessage($aMailbox['UIDSET'][$what], $passed_id);
            if ($prev >= 0) {
                $prev_href = $base_uri . 'src/read_body.php?passed_id=' . $prev . '&amp;mailbox=' . $urlMailbox . '&amp;sort=' . $sort . "&amp;where={$where}&amp;what={$what}" . '&amp;startMessage=' . $startMessage . '&amp;show_more=0';
            }
            if ($next >= 0) {
                $next_href = $base_uri . 'src/read_body.php?passed_id=' . $next . '&amp;mailbox=' . $urlMailbox . '&amp;sort=' . $sort . "&amp;where={$where}&amp;what={$what}" . '&amp;startMessage=' . $startMessage . '&amp;show_more=0';
            }
            // Only bother with Delete & Prev and Delete & Next IF
            // top display is enabled.
            if ($delete_prev_next_display == 1 && in_array('\\deleted', $aMailbox['PERMANENTFLAGS'], true)) {
                if ($prev >= 0) {
                    $del_prev_href = $base_uri . 'src/read_body.php?passed_id=' . $prev . '&amp;mailbox=' . $urlMailbox . '&amp;sort=' . $sort . '&amp;startMessage=' . $startMessage . '&amp;show_more=0' . "&amp;where={$where}&amp;what={$what}" . '&amp;delete_id=' . $passed_id . '&amp;smtoken=' . sm_generate_security_token();
                }
                if ($next >= 0) {
                    $del_next_href = $base_uri . 'src/read_body.php?passed_id=' . $next . '&amp;mailbox=' . $urlMailbox . '&amp;sort=' . $sort . '&amp;startMessage=' . $startMessage . '&amp;show_more=0' . "&amp;where={$where}&amp;what={$what}" . '&amp;delete_id=' . $passed_id . '&amp;smtoken=' . sm_generate_security_token();
                }
            }
        }
    }
    $msg_list_href = get_message_list_uri($aMailbox['NAME'], $startMessage, $what);
    if ($where == 'search.php') {
        $search_href = str_replace('read_body.php', 'search.php', $msg_list_href);
    } else {
        $search_href = '';
    }
    $comp_uri = $base_uri . 'src/compose.php' . '?passed_id=' . $passed_id . '&amp;mailbox=' . $urlMailbox . '&amp;startMessage=' . $startMessage . (isset($passed_ent_id) ? '&amp;passed_ent_id=' . $passed_ent_id : '');
    // Start form for reply/reply all/forward..
    $target = '';
    $on_click = '';
    $method = 'post';
    $onsubmit = '';
    if ($compose_new_win == '1') {
        if (!preg_match("/^[0-9]{3,4}\$/", $compose_width)) {
            $compose_width = '640';
        }
        if (!preg_match("/^[0-9]{3,4}\$/", $compose_height)) {
            $compose_height = '550';
        }
        if (checkForJavascript()) {
            $on_click = 'comp_in_new_form(\'' . $comp_uri . '\', this, this.form,' . $compose_width . ',' . $compose_height . ')';
            $comp_uri = 'javascript:void(0)';
            $method = 'get';
            $onsubmit = 'return false';
        } else {
            $target = '_blank';
        }
    }
    $oTemplate->assign('nav_on_top', $nav_on_top);
    $oTemplate->assign('prev_href', $prev_href);
    $oTemplate->assign('up_href', $up_href);
    $oTemplate->assign('next_href', $next_href);
    $oTemplate->assign('del_prev_href', $del_prev_href);
    $oTemplate->assign('del_next_href', $del_next_href);
    $oTemplate->assign('view_msg_href', $view_msg_href);
    $oTemplate->assign('message_list_href', $msg_list_href);
    $oTemplate->assign('search_href', $search_href);
    $oTemplate->assign('form_extra', '');
    $oTemplate->assign('form_method', $method);
    $oTemplate->assign('form_target', $target);
    $oTemplate->assign('form_onsubmit', $onsubmit);
    $oTemplate->assign('compose_href', $comp_uri);
    $oTemplate->assign('button_onclick', $on_click);
    $oTemplate->assign('forward_as_attachment_enabled', $enable_forward_as_attachment == 1);
    //FIXME: I am surprised these aren't already given to the template; probably needs to be given at a higher level, so I have NO IDEA if this is the right place to do this...  adding them so template can construct its own API calls... we can build those herein too if preferrable
    $oTemplate->assign('mailbox', $aMailbox['NAME']);
    $oTemplate->assign('passed_id', $passed_id);
    $oTemplate->assign('what', $what);
    // If Draft folder - create Resume link
    $resume_draft = $edit_as_new = false;
    if (isDraftMailbox($mailbox) && $save_as_draft) {
        $resume_draft = true;
    } else {
        if (handleAsSent($mailbox)) {
            $edit_as_new = true;
        }
    }
    $oTemplate->assign('can_resume_draft', $resume_draft);
    $oTemplate->assign('can_edit_as_new', $edit_as_new);
    $oTemplate->assign('mailboxes', sqimap_mailbox_option_array($imapConnection));
    if (in_array('\\deleted', $aMailbox['PERMANENTFLAGS'], true)) {
        $delete_url = $base_uri . "src/{$where}";
        $oTemplate->assign('can_be_deleted', true);
        $oTemplate->assign('move_delete_form_action', $base_uri . 'src/' . $where);
        $oTemplate->assign('delete_form_extra', addHidden('mailbox', $aMailbox['NAME']) . "\n" . addHidden('msg[0]', $passed_id) . "\n" . addHidden('startMessage', $startMessage) . "\n");
        if (!(isset($passed_ent_id) && $passed_ent_id)) {
            $oTemplate->assign('can_be_moved', true);
            $oTemplate->assign('move_form_extra', addHidden('mailbox', $aMailbox['NAME']) . "\n" . addHidden('msg[0]', $passed_id) . "\n");
            $oTemplate->assign('last_move_target', isset($lastTargetMailbox) && !empty($lastTargetMailbox) ? $lastTargetMailbox : '');
            $oTemplate->assign('can_be_copied', $show_copy_buttons == 1);
        } else {
            $oTemplate->assign('can_be_moved', false);
            $oTemplate->assign('move_form_extra', '');
            $oTemplate->assign('last_move_target', '');
            $oTemplate->assign('can_be_copied', false);
        }
    } else {
        $oTemplate->assign('can_be_deleted', false);
        $oTemplate->assign('move_delete_form_action', '');
        $oTemplate->assign('delete_form_extra', '');
        $oTemplate->assign('can_be_moved', false);
        $oTemplate->assign('move_form_extra', '');
        $oTemplate->assign('last_move_target', '');
        $oTemplate->assign('can_be_copied', false);
    }
    // access keys... only add to the top menubar, because adding
    // them twice makes them less functional (press access key, *then*
    // press <enter> to make it work)
    //
    if ($nav_on_top) {
        global $accesskey_read_msg_reply, $accesskey_read_msg_reply_all, $accesskey_read_msg_forward, $accesskey_read_msg_as_attach, $accesskey_read_msg_delete, $accesskey_read_msg_bypass_trash, $accesskey_read_msg_move, $accesskey_read_msg_move_to, $accesskey_read_msg_copy;
    } else {
        $accesskey_read_msg_reply = $accesskey_read_msg_reply_all = $accesskey_read_msg_forward = $accesskey_read_msg_as_attach = $accesskey_read_msg_delete = $accesskey_read_msg_bypass_trash = $accesskey_read_msg_move = $accesskey_read_msg_move_to = $accesskey_read_msg_copy = 'NONE';
    }
    $oTemplate->assign('accesskey_read_msg_reply', $accesskey_read_msg_reply);
    $oTemplate->assign('accesskey_read_msg_reply_all', $accesskey_read_msg_reply_all);
    $oTemplate->assign('accesskey_read_msg_forward', $accesskey_read_msg_forward);
    $oTemplate->assign('accesskey_read_msg_as_attach', $accesskey_read_msg_as_attach);
    $oTemplate->assign('accesskey_read_msg_delete', $accesskey_read_msg_delete);
    $oTemplate->assign('accesskey_read_msg_bypass_trash', $accesskey_read_msg_bypass_trash);
    $oTemplate->assign('accesskey_read_msg_move_to', $accesskey_read_msg_move_to);
    $oTemplate->assign('accesskey_read_msg_move', $accesskey_read_msg_move);
    $oTemplate->assign('accesskey_read_msg_copy', $accesskey_read_msg_copy);
    global $null;
    do_hook('read_body_menu', $null);
    if ($nav_on_top) {
        $oTemplate->display('read_menubar_nav.tpl');
        $oTemplate->display('read_menubar_buttons.tpl');
    } else {
        $oTemplate->display('read_menubar_buttons.tpl');
        $oTemplate->display('read_menubar_nav.tpl');
    }
}