X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fimap_mailbox.php;h=ee1e657adb8cddfc1c8520ed73d6b5c24636ed68;hb=6a8e7cae9c5f0779b5aa4afb8acfc295b0d8e974;hp=0cae70822d952b131522e978cc4b2f8cb5550e50;hpb=e429f01429f264713c6ee1aac1e876888ec7d1a1;p=squirrelmail.git diff --git a/functions/imap_mailbox.php b/functions/imap_mailbox.php index 0cae7082..ee1e657a 100755 --- a/functions/imap_mailbox.php +++ b/functions/imap_mailbox.php @@ -3,7 +3,7 @@ /** * imap_mailbox.php * - * Copyright (c) 1999-2002 The SquirrelMail Project Team + * Copyright (c) 1999-2003 The SquirrelMail Project Team * Licensed under the GNU GPL. For full terms see the file COPYING. * * This impliments all functions that manipulate mailboxes @@ -105,29 +105,41 @@ function readMailboxParent($haystack, $needle) { return( $ret ); } - -function isBoxBelow( $box2, $box1 ) { +/** + * Check if $subbox is below the specified $parentbox + */ +function isBoxBelow( $subbox, $parentbox ) { global $delimiter, $folder_prefix, $imap_server_type; - if ( $imap_server_type == 'uw' ) { - $boxs = $box2; - $i = strpos( $box1, $delimiter, strlen( $folder_prefix ) ); - if ( $i === false ) { - $i = strlen( $box2 ); - } - } else { - $boxs = $box2 . $delimiter; - /* Skip next second delimiter */ - $i = strpos( $box1, $delimiter ); - $i = strpos( $box1, $delimiter, $i + 1 ); - if ( $i === false ) { - $i = strlen( $box2 ); - } else { - $i++; - } + /* + * Eliminate the obvious mismatch, where the + * subfolder path is shorter than that of the potential parent + */ + if ( strlen($subbox) < strlen($parentbox) ) { + return false; } - return ( substr( $box1, 0, $i ) == substr( $boxs, 0, $i ) ); + if ( $imap_server_type == 'uw' ) { + $boxs = $parentbox; + $i = strpos( $subbox, $delimiter, strlen( $folder_prefix ) ); + if ( $i === false ) { + $i = strlen( $parentbox ); + } + } else { + if (substr($parentbox,0,strlen($subbox)) == $subbox) { + return true; + } + $boxs = $parentbox . $delimiter; + /* Skip next second delimiter */ + $i = strpos( $subbox, $delimiter ); + $i = strpos( $subbox, $delimiter, $i + 1 ); + if ( $i === false ) { + $i = strlen( $parentbox ); + } else { + $i++; + } + } + return ( substr( $subbox, 0, $i ) == substr( $boxs, 0, $i ) ); } /* Defines special mailboxes */ @@ -136,17 +148,32 @@ function isSpecialMailbox( $box ) { $move_to_trash, $move_to_sent, $save_as_draft; $ret = ( (strtolower($box) == 'inbox') || - ( $move_to_trash && isBoxBelow( $box, $trash_folder ) ) || - ( $move_to_sent && isBoxBelow( $box, $sent_folder )) || - ($save_as_draft && $box == $draft_folder ) ); + isTrashMailbox($box) || isSentMailbox($box) || isDraftMailbox($box) ); if ( !$ret ) { $ret = do_hook_function( 'special_mailbox', $box ); } - return $ret; } +function isTrashMailbox ($box) { + global $trash_folder, $move_to_trash; + return $move_to_trash && $trash_folder && + ( $box == $trash_folder || isBoxBelow($box, $trash_folder) ); +} + +function isSentMailbox($box) { + global $sent_folder, $move_to_sent; + return $move_to_sent && $sent_folder && + ( $box == $sent_folder || isBoxBelow($box, $sent_folder) ); +} + +function isDraftMailbox($box) { + global $draft_folder, $save_as_draft; + return $save_as_draft && + ( $box == $draft_folder || isBoxBelow($box, $draft_folder) ); +} + /* Expunges a mailbox */ function sqimap_mailbox_expunge ($imap_stream, $mailbox, $handle_errors = true, $id='') { global $uid_support; @@ -936,4 +963,5 @@ function sqimap_fill_mailbox_tree($mbx_ary, $mbxs=false) { return $mailboxes; } + ?>