From e019f2d0f2dc2fbfa345ab5d7ae85e67bfdd76b8 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sat, 25 Sep 2010 09:03:53 -0400
Subject: [PATCH] - s/RoundCube/Roundcube/

---
 program/include/main.inc |  122 +++++++++++++++++++++++++++++-----------
 1 files changed, 88 insertions(+), 34 deletions(-)

diff --git a/program/include/main.inc b/program/include/main.inc
index 6a81791..efcb60e 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/main.inc                                              |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev, - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev, - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -20,7 +20,7 @@
 */
 
 /**
- * RoundCube Webmail common functions
+ * Roundcube Webmail common functions
  *
  * @package Core
  * @author Thomas Bruederli <roundcube@gmail.com>
@@ -205,8 +205,8 @@
   if ($from == $to || empty($str) || empty($from))
     return $str;
 
-  // convert charset using iconv module  
-  if (function_exists('iconv') && $from != 'UTF-7' && $to != 'UTF-7') {
+  // convert charset using iconv module
+  if (function_exists('iconv') && $from != 'UTF7-IMAP' && $to != 'UTF7-IMAP') {
     if ($iconv_options === null) {
       // ignore characters not available in output charset
       $iconv_options = '//IGNORE';
@@ -334,9 +334,10 @@
     return $charsets[$input];
 
   $charset = preg_replace(array(
-    '/^[^0-9A-Z]+/',	// e.g. _ISO-8859-JP$SIO
-    '/\$.*$/',		// e.g. _ISO-8859-JP$SIO
-    '/UNICODE-1-1-*/',	// RFC1641/1642
+    '/^[^0-9A-Z]+/',    // e.g. _ISO-8859-JP$SIO
+    '/\$.*$/',          // e.g. _ISO-8859-JP$SIO
+    '/UNICODE-1-1-*/',  // RFC1641/1642
+    '/^X-/',            // X- prefix (e.g. X-ROMAN8 => ROMAN8)
     ), '', $charset);
 
   # Aliases: some of them from HTML5 spec.
@@ -356,19 +357,25 @@
     'ISO88599'	    => 'WINDOWS-1254',
     'ISO885911'	    => 'WINDOWS-874',
     'MACROMAN'	    => 'MACINTOSH',
-    '238'           => 'WINDOWS-1250',
-    '178'           => 'WINDOWS-1256',
-    '177'           => 'WINDOWS-1255',
-    '204'           => 'WINDOWS-1251',
-    '161'           => 'WINDOWS-1253',
-    '222'           => 'WINDOWS-874',
+    '77'            => 'MAC',
+    '128'           => 'SHIFT-JIS',
+    '129'           => 'CP949',
+    '130'           => 'CP1361',
     '134'           => 'GBK',
+    '136'           => 'BIG5',
+    '161'           => 'WINDOWS-1253',
+    '162'           => 'WINDOWS-1254',
+    '163'           => 'WINDOWS-1258',
+    '177'           => 'WINDOWS-1255',
+    '178'           => 'WINDOWS-1256',
+    '186'           => 'WINDOWS-1257',
+    '204'           => 'WINDOWS-1251',
+    '222'           => 'WINDOWS-874',
     '238'           => 'WINDOWS-1250',
-    '128'           => 'SHIFT-JIS'
   );
 
-  // allow a-z and 0-9 only and remove X- prefix (e.g. X-ROMAN8 => ROMAN8)
-  $str = preg_replace(array('/[^A-Z0-9]/', '/^X+/'), '', $charset);
+  // allow A-Z and 0-9 only
+  $str = preg_replace('/[^A-Z0-9]/', '', $charset);
 
   if (isset($aliases[$str]))
     $result = $aliases[$str];
@@ -385,6 +392,26 @@
   // handle broken charset names e.g. WINDOWS-1250HTTP-EQUIVCONTENT-TYPE
   else if (preg_match('/(WIN|WINDOWS)([0-9]+)/', $str, $m)) {
     $result = 'WINDOWS-' . $m[2];
+    }
+  // LATIN
+  else if (preg_match('/LATIN(.*)/', $str, $m)) {
+    $aliases = array('2' => 2, '3' => 3, '4' => 4, '5' => 9, '6' => 10,
+        '7' => 13, '8' => 14, '9' => 15, '10' => 16,
+        'ARABIC' => 6, 'CYRILLIC' => 5, 'GREEK' => 7, 'GREEK1' => 7, 'HEBREW' => 8);
+
+    // some clients sends windows-1252 text as latin1,
+    // it is safe to use windows-1252 for all latin1
+    if ($m[1] == 1) {
+      $result = 'WINDOWS-1252';
+      }
+    // if iconv is not supported we need ISO labels, it's also safe for iconv
+    else if (!empty($aliases[$m[1]])) {
+      $result = 'ISO-8859-'.$aliases[$m[1]];
+      }
+    // iconv requires convertion of e.g. LATIN-1 to LATIN1
+    else {
+      $result = $str;
+      }
     }
   else {
     $result = $charset;
@@ -700,7 +727,7 @@
  */
 function strip_quotes($str)
 {
-  return preg_replace('/[\'"]/', '', $str);
+  return str_replace(array("'", '"'), '', $str);
 }
 
 
@@ -732,8 +759,9 @@
   $table = new html_table(/*array('cols' => count($a_show_cols))*/);
     
   // add table header
-  foreach ($a_show_cols as $col)
-    $table->add_header($col, Q(rcube_label($col)));
+  if (!$attrib['noheader'])
+    foreach ($a_show_cols as $col)
+      $table->add_header($col, Q(rcube_label($col)));
   
   $c = 0;
   if (!is_array($table_data)) 
@@ -823,11 +851,14 @@
   {
   $last_pos = 0;
   $replacements = new rcube_string_replacer;
-  
+
   // ignore the whole block if evil styles are detected
   $stripped = preg_replace('/[^a-z\(:]/', '', rcmail_xss_entity_decode($source));
   if (preg_match('/expression|behavior|url\(|import/', $stripped))
     return '/* evil! */';
+
+  // remove css comments (sometimes used for some ugly hacks)
+  $source = preg_replace('!/\*(.+)\*/!Ums', '', $source);
 
   // cut out all contents between { and }
   while (($pos = strpos($source, '{', $last_pos)) && ($pos2 = strpos($source, '}', $pos)))
@@ -836,22 +867,22 @@
     $source = substr($source, 0, $pos+1) . $replacements->get_replacement($key) . substr($source, $pos2, strlen($source)-$pos2);
     $last_pos = $pos+2;
   }
-  
+
   // remove html comments and add #container to each tag selector.
   // also replace body definition because we also stripped off the <body> tag
   $styles = preg_replace(
     array(
       '/(^\s*<!--)|(-->\s*$)/',
-      '/(^\s*|,\s*|\}\s*)([a-z0-9\._#][a-z0-9\.\-_]*)/im',
-      "/$container_id\s+body/i",
+      '/(^\s*|,\s*|\}\s*)([a-z0-9\._#\*][a-z0-9\.\-_]*)/im',
+      '/'.preg_quote($container_id, '/').'\s+body/i',
     ),
     array(
       '',
       "\\1#$container_id \\2",
-      "$container_id div.rcmBody",
+      $container_id,
     ),
     $source);
-  
+
   // put block contents back in
   $styles = $replacements->resolve($styles);
 
@@ -1113,14 +1144,14 @@
       return true;
   }
  
-  $log_entry = sprintf("[%s]: %s\n", $date, $line);
-
   if ($CONFIG['log_driver'] == 'syslog') {
     $prio = $name == 'errors' ? LOG_ERR : LOG_INFO;
-    syslog($prio, $log_entry);
+    syslog($prio, $line);
     return true;
   }
   else {
+    $line = sprintf("[%s]: %s\n", $date, $line);
+
     // log_driver == 'file' is assumed here
     if (empty($CONFIG['log_dir']))
       $CONFIG['log_dir'] = INSTALL_PATH.'logs';
@@ -1128,7 +1159,7 @@
     // try to open specific log file for writing
     $logfile = $CONFIG['log_dir'].'/'.$name;
     if ($fp = @fopen($logfile, 'a')) {
-      fwrite($fp, $log_entry);
+      fwrite($fp, $line);
       fflush($fp);
       fclose($fp);
       return true;
@@ -1501,7 +1532,11 @@
   if ($hook['abort'])
     return;  
 
-  $lang = strtolower(substr($_SESSION['language'], 0, 2));
+  $lang = strtolower($_SESSION['language']);
+
+  // TinyMCE uses 'tw' for zh_TW (which is wrong, because tw is a code of Twi language)
+  $lang = ($lang == 'zh_tw') ? 'tw' : substr($lang, 0, 2);
+
   if (!file_exists(INSTALL_PATH . 'program/js/tiny_mce/langs/'.$lang.'.js'))
     $lang = 'en';
 
@@ -1521,8 +1556,10 @@
 function rcube_https_check($port=null, $use_https=true)
 {
   global $RCMAIL;
-  
+
   if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off')
+    return true;
+  if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https')
     return true;
   if ($port && $_SERVER['SERVER_PORT'] == $port)
     return true;
@@ -1532,12 +1569,30 @@
   return false;
 }
 
+
 // for backward compatibility
 function rcube_sess_unset($var_name=null)
 {
   global $RCMAIL;
 
   $RCMAIL->session->remove($var_name);
+}
+
+
+// Replaces hostname variables
+function rcube_parse_host($name)
+{
+  // %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 = preg_replace('/^[^\.]+\./', '', $n);
+  // %h - IMAP host
+  $h = $_SESSION['imap_host'];
+  // %z - IMAP domain without first part, e.g. %h=imap.domain.tld, %z=domain.tld
+  $z = preg_replace('/^[^\.]+\./', '', $h);
+
+  $name = str_replace(array('%n', '%d', '%h', '%z'), array($n, $d, $h, $z), $name);
+  return $name;
 }
 
 
@@ -1566,7 +1621,7 @@
   // from PEAR::Validate
   $regexp = '&^(?:
 	("\s*(?:[^"\f\n\r\t\v\b\s]+\s*)+")| 			 	#1 quoted name
-	([-\w!\#\$%\&\'*+~/^`|{}]+(?:\.[-\w!\#\$%\&\'*+~/^`|{}]+)*)) 	#2 OR dot-atom
+	([-\w!\#\$%\&\'*+~/^`|{}=]+(?:\.[-\w!\#\$%\&\'*+~/^`|{}=]+)*)) 	#2 OR dot-atom (RFC5322)
 	$&xi';
 
   if (!preg_match($regexp, $local_part))
@@ -1710,4 +1765,3 @@
     }
 }
 
-?>

--
Gitblit v1.9.1