alecpl
2010-03-01 929a508d801d9434c8d98dccd0311e3a707303ba
program/include/main.inc
@@ -69,7 +69,7 @@
 */
function get_sequence_name($sequence)
  {
  // return table name if configured
  // return sequence name if configured
  $config_key = 'db_sequence_'.$sequence;
  $opt = rcmail::get_instance()->config->get($config_key);
@@ -170,6 +170,18 @@
/**
 * Catch an error and throw an exception.
 *
 * @param  int    Level of the error
 * @param  string Error message
 */
function rcube_error_handler($errno, $errstr)
  {
  throw new ErrorException($errstr, 0, $errno);
  }
/**
 * Convert a string from one charset to another.
 * Uses mbstring and iconv functions if possible
 *
@@ -180,6 +192,7 @@
 */
function rcube_charset_convert($str, $from, $to=NULL)
  {
  static $iconv_options = null;
  static $mbstring_loaded = null;
  static $mbstring_list = null;
  static $convert_warning = false;
@@ -187,7 +200,7 @@
  
  $error = false;
  $to = empty($to) ? $to = strtoupper(RCMAIL_CHARSET) : rcube_parse_charset($to);
  $to = empty($to) ? strtoupper(RCMAIL_CHARSET) : rcube_parse_charset($to);
  $from = rcube_parse_charset($from);
  if ($from == $to || empty($str) || empty($from))
@@ -195,20 +208,36 @@
  // convert charset using iconv module  
  if (function_exists('iconv') && $from != 'UTF-7' && $to != 'UTF-7') {
    $_iconv = iconv($from, $to . '//IGNORE', $str);
    if ($iconv_options === null) {
      // transliterate characters not available in output charset
      $iconv_options = '//TRANSLIT';
      if (iconv('', $iconv_options, '') === false) {
        // iconv implementation does not support options
        $iconv_options = '';
      }
    }
    // throw an exception if iconv reports an illegal character in input
    // it means that input string has been truncated
    set_error_handler('rcube_error_handler', E_NOTICE);
    try {
      $_iconv = iconv($from, $to . $iconv_options, $str);
    } catch (ErrorException $e) {
      $_iconv = false;
    }
    restore_error_handler();
    if ($_iconv !== false) {
        return $_iconv;
      return $_iconv;
    }
  }
  if (is_null($mbstring_loaded))
  if ($mbstring_loaded === null)
    $mbstring_loaded = extension_loaded('mbstring');
    
  // convert charset using mbstring module
  if ($mbstring_loaded) {
    $aliases['WINDOWS-1257'] = 'ISO-8859-13';
    
    if (is_null($mbstring_list)) {
    if ($mbstring_list === null) {
      $mbstring_list = mb_list_encodings();
      $mbstring_list = array_map('strtoupper', $mbstring_list);
    }
@@ -303,7 +332,7 @@
  $charset = preg_replace(array(
    '/^[^0-9A-Z]+/',   // e.g. _ISO-8859-JP$SIO
    '/\$.*$/',      // e.g. _ISO-8859-JP$SIO
    '/UNICODE-1-1-/',   // RFC1642
    '/UNICODE-1-1-*/',   // RFC1641/1642
    ), '', $charset);
  # Aliases: some of them from HTML5 spec.
@@ -322,15 +351,25 @@
    'TIS620'       => 'WINDOWS-874',
    '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',
    '134'           => 'GBK',
    '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]/i', '/^x+/i'), '', $charset);
  $str = preg_replace(array('/[^A-Z0-9]/', '/^X+/'), '', $charset);
  if (isset($aliases[$str]))
    return $aliases[$str];
  if (preg_match('/UTF(7|8|16|32)(BE|LE)*/', $str, $m))
  if (preg_match('/U[A-Z][A-Z](7|8|16|32)(BE|LE)*/', $str, $m))
    return 'UTF-' . $m[1] . $m[2];
  if (preg_match('/ISO8859([0-9]{0,2})/', $str, $m)) {
@@ -338,6 +377,11 @@
    # some clients sends windows-1252 text as latin1,
    # it is safe to use windows-1252 for all latin1
    return $iso == 'ISO-8859-1' ? 'WINDOWS-1252' : $iso;
    }
  // handle broken charset names e.g. WINDOWS-1250HTTP-EQUIVCONTENT-TYPE
  if (preg_match('/WINDOWS([0-9]+)/', $str, $m)) {
    return 'WINDOWS-' . $m[1];
    }
  return $charset;
@@ -485,12 +529,15 @@
    $xml_rep_table['&'] = '&';
    for ($c=160; $c<256; $c++)  // can be increased to support more charsets
      $xml_rep_table[Chr($c)] = "&#$c;";
      $xml_rep_table[chr($c)] = "&#$c;";
    $xml_rep_table['"'] = '&quot;';
    $js_rep_table['"'] = '\\"';
    $js_rep_table["'"] = "\\'";
    $js_rep_table["\\"] = "\\\\";
    // Unicode line and paragraph separators (#1486310)
    $js_rep_table[chr(hexdec(E2)).chr(hexdec(80)).chr(hexdec(A8))] = '&#8232;';
    $js_rep_table[chr(hexdec(E2)).chr(hexdec(80)).chr(hexdec(A9))] = '&#8233;';
    }
  // encode for javascript use
@@ -549,7 +596,6 @@
 */
function get_input_value($fname, $source, $allow_html=FALSE, $charset=NULL)
{
  global $OUTPUT;
  $value = NULL;
  
  if ($source==RCUBE_INPUT_GET && isset($_GET[$fname]))
@@ -566,8 +612,30 @@
      $value = $_COOKIE[$fname];
    }
  return parse_input_value($value, $allow_html, $charset);
}
/**
 * Parse/validate input value. See get_input_value()
 * Performs stripslashes() and charset conversion if necessary
 *
 * @param  string   Input value
 * @param  boolean  Allow HTML tags in field value
 * @param  string   Charset to convert into
 * @return string   Parsed value
 */
function parse_input_value($value, $allow_html=FALSE, $charset=NULL)
{
  global $OUTPUT;
  if (empty($value))
    return $value;
  if (is_array($value)) {
    foreach ($value as $idx => $val)
      $value[$idx] = parse_input_value($val, $allow_html, $charset);
    return $value;
  }
  // strip single quotes if magic_quotes_sybase is enabled
  if (ini_get('magic_quotes_sybase'))
@@ -581,7 +649,7 @@
    $value = strip_tags($value);
  
  // convert to internal charset
  if (is_object($OUTPUT))
  if (is_object($OUTPUT) && $charset)
    return rcube_charset_convert($value, $OUTPUT->get_charset(), $charset);
  else
    return $value;
@@ -903,13 +971,15 @@
  $today_limit = mktime(0, 0, 0, $now_date['mon'], $now_date['mday'], $now_date['year']);
  $week_limit = mktime(0, 0, 0, $now_date['mon'], $now_date['mday']-6, $now_date['year']);
  // define date format depending on current time
  if ($CONFIG['prettydate'] && !$format && $timestamp > $today_limit && $timestamp < $now)
    return sprintf('%s %s', rcube_label('today'), date($CONFIG['date_today'] ? $CONFIG['date_today'] : 'H:i', $timestamp));
  else if ($CONFIG['prettydate'] && !$format && $timestamp > $week_limit && $timestamp < $now)
    $format = $CONFIG['date_short'] ? $CONFIG['date_short'] : 'D H:i';
  else if (!$format)
    $format = $CONFIG['date_long'] ? $CONFIG['date_long'] : 'd.m.Y H:i';
  // define date format depending on current time
  if (!$format) {
    if ($CONFIG['prettydate'] && $timestamp > $today_limit && $timestamp < $now)
      return sprintf('%s %s', rcube_label('today'), date($CONFIG['date_today'] ? $CONFIG['date_today'] : 'H:i', $timestamp));
    else if ($CONFIG['prettydate'] && $timestamp > $week_limit && $timestamp < $now)
      $format = $CONFIG['date_short'] ? $CONFIG['date_short'] : 'D H:i';
    else
      $format = $CONFIG['date_long'] ? $CONFIG['date_long'] : 'd.m.Y H:i';
    }
  // strftime() format
  if (preg_match('/%[a-z]+/i', $format))
@@ -1097,7 +1167,7 @@
  global $RCMAIL;
  static $a_mailboxes;
  
  $attrib += array('maxlength' => 100, 'relanames' => false);
  $attrib += array('maxlength' => 100, 'realnames' => false);
  // add some labels to client
  $RCMAIL->output->add_label('purgefolderconfirm', 'deletemessagesconfirm');
@@ -1417,12 +1487,20 @@
    return true;
  if ($port && $_SERVER['SERVER_PORT'] == $port)
    return true;
  if ($use_https && $RCMAIL->config->get('use_https'))
  if ($use_https && isset($RCMAIL) && $RCMAIL->config->get('use_https'))
    return true;
  return false;
}
// for backward compatibility
function rcube_sess_unset($var_name=null)
{
  global $RCMAIL;
  $RCMAIL->session->remove($var_name);
}
/**
 * E-mail address validation