From bc8c2c57880523472b30f475d566a8133e2d2e20 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sat, 21 May 2011 14:04:51 -0400
Subject: [PATCH] - Fix s/pattern/prefix/ in clear_cache()

---
 program/include/main.inc |  114 ++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 68 insertions(+), 46 deletions(-)

diff --git a/program/include/main.inc b/program/include/main.inc
index d7009c0..44a43c6 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -1158,25 +1158,28 @@
 {
   global $RCMAIL;
   static $a_mailboxes;
-  
+
   $attrib += array('maxlength' => 100, 'realnames' => false);
 
   // add some labels to client
   $RCMAIL->output->add_label('purgefolderconfirm', 'deletemessagesconfirm');
-  
+
   $type = $attrib['type'] ? $attrib['type'] : 'ul';
   unset($attrib['type']);
 
   if ($type=='ul' && !$attrib['id'])
     $attrib['id'] = 'rcmboxlist';
 
+  if (empty($attrib['folder_name']))
+    $attrib['folder_name'] = '*';
+
   // get mailbox list
   $mbox_name = $RCMAIL->imap->get_mailbox_name();
-  
+
   // build the folders tree
   if (empty($a_mailboxes)) {
     // get mailbox list
-    $a_folders = $RCMAIL->imap->list_mailboxes();
+    $a_folders = $RCMAIL->imap->list_mailboxes('', $attrib['folder_name'], $attrib['folder_filter']);
     $delimiter = $RCMAIL->imap->get_hierarchy_delimiter();
     $a_mailboxes = array();
 
@@ -1187,20 +1190,20 @@
   // allow plugins to alter the folder tree or to localize folder names
   $hook = $RCMAIL->plugins->exec_hook('render_mailboxlist', array('list' => $a_mailboxes, 'delimiter' => $delimiter));
 
-  if ($type=='select') {
+  if ($type == 'select') {
     $select = new html_select($attrib);
-    
+
     // add no-selection option
     if ($attrib['noselection'])
-      $select->add(rcube_label($attrib['noselection']), '0');
-    
+      $select->add(rcube_label($attrib['noselection']), '');
+
     rcmail_render_folder_tree_select($hook['list'], $mbox_name, $attrib['maxlength'], $select, $attrib['realnames']);
     $out = $select->show();
   }
   else {
     $js_mailboxlist = array();
     $out = html::tag('ul', $attrib, rcmail_render_folder_tree_html($hook['list'], $mbox_name, $js_mailboxlist, $attrib), html::$common_attrib);
-    
+
     $RCMAIL->output->add_gui_object('mailboxlist', $attrib['id']);
     $RCMAIL->output->set_env('mailboxes', $js_mailboxlist);
     $RCMAIL->output->set_env('collapsed_folders', $RCMAIL->config->get('collapsed_folders'));
@@ -1219,26 +1222,32 @@
 function rcmail_mailbox_select($p = array())
 {
   global $RCMAIL;
-  
+
   $p += array('maxlength' => 100, 'realnames' => false);
   $a_mailboxes = array();
 
-  if ($p['unsubscribed'])
-    $list = $RCMAIL->imap->list_unsubscribed();
-  else
-    $list = $RCMAIL->imap->list_mailboxes();
+  if (empty($p['folder_name']))
+    $p['folder_name'] = '*';
 
-  foreach ($list as $folder)
+  if ($p['unsubscribed'])
+    $list = $RCMAIL->imap->list_unsubscribed('', $p['folder_name'], $p['folder_filter']);
+  else
+    $list = $RCMAIL->imap->list_mailboxes('', $p['folder_name'], $p['folder_filter']);
+
+  $delimiter = $RCMAIL->imap->get_hierarchy_delimiter();
+
+  foreach ($list as $folder) {
     if (empty($p['exceptions']) || !in_array($folder, $p['exceptions']))
-      rcmail_build_folder_tree($a_mailboxes, $folder, $RCMAIL->imap->get_hierarchy_delimiter());
+      rcmail_build_folder_tree($a_mailboxes, $folder, $delimiter);
+  }
 
   $select = new html_select($p);
-  
+
   if ($p['noselection'])
     $select->add($p['noselection'], '');
-    
+
   rcmail_render_folder_tree_select($a_mailboxes, $mbox, $p['maxlength'], $select, $p['realnames']);
-  
+
   return $select;
 }
 
@@ -1251,6 +1260,17 @@
 function rcmail_build_folder_tree(&$arrFolders, $folder, $delm='/', $path='')
 {
   global $RCMAIL;
+
+  // Handle namespace prefix
+  $prefix = '';
+  if (!$path) {
+    $n_folder = $folder;
+    $folder = $RCMAIL->imap->mod_mailbox($folder);
+
+    if ($n_folder != $folder) {
+      $prefix = substr($n_folder, 0, -strlen($folder));
+    }
+  }
 
   $pos = strpos($folder, $delm);
 
@@ -1272,14 +1292,14 @@
     $virtual = false;
   }
 
-  $path .= $currentFolder;
-
-  // Check \Noselect option (if options are in cache)
-  if (!$virtual && ($opts = $RCMAIL->imap->mailbox_options($path))) {
-    $virtual = in_array('\\Noselect', $opts);
-  }
+  $path .= $prefix.$currentFolder;
 
   if (!isset($arrFolders[$currentFolder])) {
+    // Check \Noselect option (if options are in cache)
+    if (!$virtual && ($opts = $RCMAIL->imap->mailbox_options($path))) {
+      $virtual = in_array('\\Noselect', $opts);
+    }
+
     $arrFolders[$currentFolder] = array(
       'id' => $path,
       'name' => rcube_charset_convert($currentFolder, 'UTF7-IMAP'),
@@ -1292,7 +1312,7 @@
   if (strlen($subFolders))
     rcmail_build_folder_tree($arrFolders[$currentFolder]['folders'], $subFolders, $delm, $path.$delm);
 }
-  
+
 
 /**
  * Return html for a structured list &lt;ul&gt; for the mailbox tree
@@ -1302,7 +1322,7 @@
 function rcmail_render_folder_tree_html(&$arrFolders, &$mbox_name, &$jslist, $attrib, $nestLevel=0)
 {
   global $RCMAIL, $CONFIG;
-  
+
   $maxlength = intval($attrib['maxlength']);
   $realnames = (bool)$attrib['realnames'];
   $msgcounts = $RCMAIL->imap->get_cache('messagecount');
@@ -1345,15 +1365,15 @@
       $classes[] = 'inbox';
     else
       $classes[] = '_'.asciiwords($folder_class ? $folder_class : strtolower($folder['id']), true);
-      
+
     $classes[] = $zebra_class;
-    
+
     if ($folder['id'] == $mbox_name)
       $classes[] = 'selected';
 
     $collapsed = preg_match('/&'.rawurlencode($folder['id']).'&/', $RCMAIL->config->get('collapsed_folders'));
     $unread = $msgcounts ? intval($msgcounts[$folder['id']]['UNSEEN']) : 0;
-    
+
     if ($folder['virtual'])
       $classes[] = 'virtual';
     else if ($unread)
@@ -1378,9 +1398,9 @@
         'style' => "position:absolute",
         'onclick' => sprintf("%s.command('collapse-folder', '%s')", JS_OBJECT_NAME, $js_name)
       ), '&nbsp;') : ''));
-    
+
     $jslist[$folder_id] = array('id' => $folder['id'], 'name' => $foldername, 'virtual' => $folder['virtual']);
-    
+
     if (!empty($folder['folders'])) {
       $out .= html::tag('ul', array('style' => ($collapsed ? "display:none;" : null)),
         rcmail_render_folder_tree_html($folder['folders'], $mbox_name, $jslist, $attrib, $nestLevel+1));
@@ -1400,32 +1420,28 @@
  * @return string
  */
 function rcmail_render_folder_tree_select(&$arrFolders, &$mbox_name, $maxlength, &$select, $realnames=false, $nestLevel=0)
-  {
-  $idx = 0;
+{
   $out = '';
-  foreach ($arrFolders as $key=>$folder)
-    {
+
+  foreach ($arrFolders as $key=>$folder) {
     if (!$realnames && ($folder_class = rcmail_folder_classname($folder['id'])))
       $foldername = rcube_label($folder_class);
-    else
-      {
+    else {
       $foldername = $folder['name'];
-      
+
       // shorten the folder name to a given length
       if ($maxlength && $maxlength>1)
         $foldername = abbreviate_string($foldername, $maxlength);
-      }
+    }
 
     $select->add(str_repeat('&nbsp;', $nestLevel*4) . $foldername, $folder['id']);
 
     if (!empty($folder['folders']))
       $out .= rcmail_render_folder_tree_select($folder['folders'], $mbox_name, $maxlength, $select, $realnames, $nestLevel+1);
-
-    $idx++;
-    }
+  }
 
   return $out;
-  }
+}
 
 
 /**
@@ -1673,14 +1689,20 @@
 {
   // %n - host
   $n = preg_replace('/:\d+$/', '', $_SERVER['SERVER_NAME']);
-  // %d - domain name without first part, e.g. %d=mail.domain.tld, %m=domain.tld
+  // %d - domain name without first part, e.g. %n=mail.domain.tld, %d=domain.tld
   $d = preg_replace('/^[^\.]+\./', '', $n);
   // %h - IMAP host
   $h = $_SESSION['imap_host'] ? $_SESSION['imap_host'] : $host;
   // %z - IMAP domain without first part, e.g. %h=imap.domain.tld, %z=domain.tld
   $z = preg_replace('/^[^\.]+\./', '', $h);
+  // %s - domain name after the '@' from e-mail address provided at login screen. Returns FALSE if an invalid email is provided
+  if ( strpos($name, '%s') !== false ){
+    $user_email = rcube_idn_convert(get_input_value('_user', RCUBE_INPUT_POST), true);
+    if ( preg_match('/(.*)@([a-z0-9\.\-\[\]\:]+)/i', $user_email, $s) < 1 || filter_var($s[1]."@".$s[2], FILTER_VALIDATE_EMAIL) === false )
+      return false;
+  }
 
-  $name = str_replace(array('%n', '%d', '%h', '%z'), array($n, $d, $h, $z), $name);
+  $name = str_replace(array('%n', '%d', '%h', '%z', '%s'), array($n, $d, $h, $z, $s[2]), $name);
   return $name;
 }
 

--
Gitblit v1.9.1