| 1 | <?php |
| 2 | /** |
| 3 | * folders.php |
| 4 | * |
| 5 | * Handles all interaction between the user and the other folder |
| 6 | * scripts which do most of the work. Also handles the Special |
| 7 | * Folders. |
| 8 | * |
| 9 | * @copyright © 1999-2007 The SquirrelMail Project Team |
| 10 | * @license http://opensource.org/licenses/gpl-license.php GNU Public License |
| 11 | * @version $Id$ |
| 12 | * @package squirrelmail |
| 13 | */ |
| 14 | |
| 15 | /** This is the folders page */ |
| 16 | define('PAGE_NAME', 'folders'); |
| 17 | |
| 18 | /** |
| 19 | * Include the SquirrelMail initialization file. |
| 20 | */ |
| 21 | require('../include/init.php'); |
| 22 | |
| 23 | /* SquirrelMail required files. */ |
| 24 | require_once(SM_PATH . 'functions/imap_general.php'); |
| 25 | require_once(SM_PATH . 'functions/folder_manip.php'); |
| 26 | require_once(SM_PATH . 'functions/forms.php'); |
| 27 | |
| 28 | displayPageHeader($color); |
| 29 | |
| 30 | /* get globals we may need */ |
| 31 | sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION); |
| 32 | sqgetGlobalVar('smaction', $action, SQ_POST); |
| 33 | |
| 34 | /* end of get globals */ |
| 35 | |
| 36 | $imapConnection = sqimap_login ($username, false, $imapServerAddress, $imapPort, 0); |
| 37 | |
| 38 | /* switch to the right function based on what the user selected */ |
| 39 | if ( sqgetGlobalVar('smaction', $action, SQ_POST) ) { |
| 40 | switch ($action) |
| 41 | { |
| 42 | case 'create': |
| 43 | sqgetGlobalVar('folder_name', $folder_name, SQ_POST); |
| 44 | sqgetGlobalVar('subfolder', $subfolder, SQ_POST); |
| 45 | sqgetGlobalVar('contain_subs', $contain_subs, SQ_POST); |
| 46 | folders_create($imapConnection, $delimiter, $folder_name, $subfolder, $contain_subs); |
| 47 | $td_str = _("Created folder successfully."); |
| 48 | break; |
| 49 | case 'rename': |
| 50 | if ( sqgetGlobalVar('cancelbutton', $dummy, SQ_POST) ) { |
| 51 | break; |
| 52 | } |
| 53 | if ( ! sqgetGlobalVar('new_name', $new_name, SQ_POST) ) { |
| 54 | sqgetGlobalVar('old_name', $old_name, SQ_POST); |
| 55 | folders_rename_getname($imapConnection, $delimiter, $old_name); |
| 56 | } else { |
| 57 | sqgetGlobalVar('orig', $orig, SQ_POST); |
| 58 | sqgetGlobalVar('old_name', $old_name, SQ_POST); |
| 59 | folders_rename_do($imapConnection, $delimiter, $orig, $old_name, $new_name); |
| 60 | $td_str = _("Renamed successfully."); |
| 61 | } |
| 62 | break; |
| 63 | case 'delete': |
| 64 | if ( sqgetGlobalVar('cancelbutton', $dummy, SQ_POST) ) { |
| 65 | break; |
| 66 | } |
| 67 | sqgetGlobalVar('folder_name', $folder_name, SQ_POST); |
| 68 | if ( sqgetGlobalVar('confirmed', $dummy, SQ_POST) ) { |
| 69 | folders_delete_do($imapConnection, $delimiter, $folder_name); |
| 70 | $td_str = _("Deleted folder successfully."); |
| 71 | } else { |
| 72 | folders_delete_ask($imapConnection, $folder_name); |
| 73 | } |
| 74 | break; |
| 75 | case 'subscribe': |
| 76 | sqgetGlobalVar('folder_names', $folder_names, SQ_POST); |
| 77 | folders_subscribe($imapConnection, $folder_names); |
| 78 | $td_str = _("Subscribed successfully."); |
| 79 | break; |
| 80 | case 'unsubscribe': |
| 81 | sqgetGlobalVar('folder_names', $folder_names, SQ_POST); |
| 82 | folders_unsubscribe($imapConnection, $folder_names); |
| 83 | $td_str = _("Unsubscribed successfully."); |
| 84 | break; |
| 85 | default: |
| 86 | // TODO: this is a new hook for plugin action processing that has not been TESTED. |
| 87 | $td_str = do_hook('folder_action', $action); |
| 88 | break; |
| 89 | } |
| 90 | |
| 91 | } |
| 92 | |
| 93 | if (isset($td_str)) { |
| 94 | $oTemplate->assign('note', htmlspecialchars($td_str)); |
| 95 | $oTemplate->display('note.tpl'); |
| 96 | } |
| 97 | |
| 98 | $boxes = sqimap_mailbox_list($imapConnection,true); |
| 99 | |
| 100 | /** CREATING FOLDERS **/ |
| 101 | |
| 102 | $show_selected = array(); |
| 103 | $skip_folders = array(); |
| 104 | $server_type = strtolower($imap_server_type); |
| 105 | |
| 106 | // Special handling for courier |
| 107 | if ( $server_type == 'courier' ) { |
| 108 | if ( $default_folder_prefix == 'INBOX.' ) { |
| 109 | // We don't need INBOX, since it is top folder |
| 110 | array_push($skip_folders, 'INBOX'); |
| 111 | } |
| 112 | } elseif ( $server_type == 'bincimap' ) { |
| 113 | if ( $default_folder_prefix == 'INBOX/' ) { |
| 114 | // We don't need INBOX, since it is top folder |
| 115 | array_push($skip_folders, 'INBOX'); |
| 116 | } |
| 117 | } |
| 118 | |
| 119 | if ( $default_sub_of_inbox == false ) { |
| 120 | $mbx_option_list = '<option selected="selected" value="">[ '._("None")." ]</option>\n"; |
| 121 | } else { |
| 122 | $mbx_option_list = '<option value="">[ '._("None")." ]</option>\n"; |
| 123 | $show_selected = array('inbox'); |
| 124 | } |
| 125 | |
| 126 | // Call sqimap_mailbox_option_list, using existing connection to IMAP server, |
| 127 | // the arrays of folders to include or skip (assembled above), |
| 128 | // use 'noinferiors' as a mailbox filter to leave out folders that can not contain other folders. |
| 129 | // use the long format to show subfolders in an intelligible way if parent is missing (special folder) |
| 130 | $mbx_option_list .= sqimap_mailbox_option_list($imapConnection, $show_selected, $skip_folders, $boxes, 'noinferiors', true); |
| 131 | |
| 132 | |
| 133 | /** count special folders **/ |
| 134 | foreach ($boxes as $index => $aBoxData) { |
| 135 | if (isSpecialMailbox($aBoxData['unformatted'],false) && |
| 136 | ! in_array($aBoxData['unformatted'],$skip_folders)) { |
| 137 | $skip_folders[] = $aBoxData['unformatted']; |
| 138 | } |
| 139 | } |
| 140 | |
| 141 | /** |
| 142 | * Retrieve list of folders when special folders are excluded. Special folders |
| 143 | * should be unavailable in rename/delete/unsubscribe. Theoretically user can |
| 144 | * modify form and perform these operations with special folders, but if user |
| 145 | * manages to delete/rename/unsubscribe special folder by hacking form... |
| 146 | * |
| 147 | * If script or program depends on special folder, they should not assume that |
| 148 | * folder is available. |
| 149 | * |
| 150 | * $filtered_folders contains empty string or html formated option list. |
| 151 | */ |
| 152 | $rendel_folder_list = sqimap_mailbox_option_list($imapConnection, 0, $skip_folders, $boxes, NULL, true); |
| 153 | |
| 154 | |
| 155 | $subbox_option_list = array(); |
| 156 | |
| 157 | if ($show_only_subscribed_folders && !$no_list_for_subscribe) { |
| 158 | // FIXME: fix subscription options when top folder is not subscribed and sub folder is subscribed |
| 159 | |
| 160 | // TODO: use checkboxes instead of select options. |
| 161 | // DONE Steve Brown 2006-08-08 |
| 162 | |
| 163 | /** SUBSCRIBE TO FOLDERS **/ |
| 164 | $boxes_all = sqimap_mailbox_list_all ($imapConnection); |
| 165 | |
| 166 | // here we filter out all boxes we're already subscribed to, |
| 167 | // so we keep only the unsubscribed ones. |
| 168 | foreach ($boxes_all as $box_a) { |
| 169 | |
| 170 | $use_folder = true; |
| 171 | foreach ( $boxes as $box ) { |
| 172 | if ($box_a['unformatted'] == $box['unformatted'] || |
| 173 | $box_a['unformatted-dm'] == $folder_prefix ) { |
| 174 | $use_folder = false; |
| 175 | } |
| 176 | } |
| 177 | |
| 178 | if ($use_folder) { |
| 179 | $box_enc = htmlspecialchars($box_a['unformatted-dm']); |
| 180 | $box_disp = htmlspecialchars(imap_utf7_decode_local($box_a['unformatted-disp'])); |
| 181 | $subbox_option_list[] = array( 'Value' => $box_enc, 'Display' => $box_disp); |
| 182 | } |
| 183 | } |
| 184 | } |
| 185 | |
| 186 | sqimap_logout($imapConnection); |
| 187 | |
| 188 | $oTemplate->assign('show_subfolders_option', $show_contain_subfolders_option); |
| 189 | $oTemplate->assign('show_only_subscribed_folders', $show_only_subscribed_folders==1); |
| 190 | $oTemplate->assign('no_list_for_subscribe', $no_list_for_subscribe); |
| 191 | |
| 192 | $oTemplate->assign('mbx_option_list', $mbx_option_list); |
| 193 | $oTemplate->assign('rendel_folder_list', $rendel_folder_list); |
| 194 | $oTemplate->assign('subbox_option_list', $subbox_option_list); |
| 195 | |
| 196 | $oTemplate->display('folder_manip.tpl'); |
| 197 | |
| 198 | $oTemplate->display('footer.tpl'); |