alecpl
2010-01-28 ac9759b6a4e2eec68dda27f81d8001c9d4e18f9f
program/include/main.inc
@@ -195,7 +195,7 @@
  // convert charset using iconv module  
  if (function_exists('iconv') && $from != 'UTF-7' && $to != 'UTF-7') {
    $_iconv = iconv($from, $to . '//IGNORE', $str);
    $_iconv = @iconv($from, $to . '//IGNORE', $str);
    if ($_iconv !== false) {
        return $_iconv;
    }
@@ -300,8 +300,11 @@
  {
  $charset = strtoupper($charset);
  # RFC1642
  $charset = str_replace('UNICODE-1-1-', '', $charset);
  $charset = preg_replace(array(
    '/^[^0-9A-Z]+/',   // e.g. _ISO-8859-JP$SIO
    '/\$.*$/',      // e.g. _ISO-8859-JP$SIO
    '/UNICODE-1-1-/',   // RFC1642
    ), '', $charset);
  # Aliases: some of them from HTML5 spec.
  $aliases = array(
@@ -319,6 +322,7 @@
    'TIS620'       => 'WINDOWS-874',
    'ISO88599'       => 'WINDOWS-1254',
    'ISO885911'       => 'WINDOWS-874',
    'MACROMAN'       => 'MACINTOSH',
  );
  // allow a-z and 0-9 only and remove X- prefix (e.g. X-ROMAN8 => ROMAN8)
@@ -482,12 +486,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
@@ -900,13 +907,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))
@@ -946,7 +955,7 @@
/**
 * Compose a valid representaion of name and e-mail address
 * Compose a valid representation of name and e-mail address
 *
 * @param string E-mail address
 * @param string Person name
@@ -957,10 +966,10 @@
  if ($name && $name != $email)
    {
    // Special chars as defined by RFC 822 need to in quoted string (or escaped).
    return sprintf('%s <%s>', preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $name) ? '"'.addcslashes($name, '"').'"' : $name, $email);
    return sprintf('%s <%s>', preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $name) ? '"'.addcslashes($name, '"').'"' : $name, trim($email));
    }
  else
    return $email;
    return trim($email);
  }
@@ -1026,7 +1035,7 @@
    $line = $log['line'];
    $date = $log['date'];
    if ($log['abort'])
      return;
      return true;
  }
 
  $log_entry = sprintf("[%s]: %s\n", $date, $line);
@@ -1042,12 +1051,15 @@
      $CONFIG['log_dir'] = INSTALL_PATH.'logs';
    // try to open specific log file for writing
    if ($fp = @fopen($CONFIG['log_dir'].'/'.$name, 'a')) {
    $logfile = $CONFIG['log_dir'].'/'.$name;
    if ($fp = @fopen($logfile, 'a')) {
      fwrite($fp, $log_entry);
      fflush($fp);
      fclose($fp);
      return true;
    }
    else
      trigger_error("Error writing to log file $logfile; Please check permissions", E_USER_WARNING);
  }
  return false;
}
@@ -1091,7 +1103,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');
@@ -1152,11 +1164,12 @@
{
  global $RCMAIL;
  
  $p += array('maxlength' => 100, 'relanames' => false);
  $p += array('maxlength' => 100, 'realnames' => false);
  $a_mailboxes = array();
  
  foreach ($RCMAIL->imap->list_mailboxes() as $folder)
    rcmail_build_folder_tree($a_mailboxes, $folder, $RCMAIL->imap->get_hierarchy_delimiter());
    if (empty($p['exceptions']) || !in_array($folder, $p['exceptions']))
      rcmail_build_folder_tree($a_mailboxes, $folder, $RCMAIL->imap->get_hierarchy_delimiter());
  $select = new html_select($p);
  
@@ -1378,18 +1391,96 @@
 */
function rcube_html_editor($mode='')
{
  global $OUTPUT, $CONFIG;
  global $RCMAIL, $CONFIG;
  $lang = $tinylang = strtolower(substr($_SESSION['language'], 0, 2));
  if (!file_exists(INSTALL_PATH . 'program/js/tiny_mce/langs/'.$tinylang.'.js'))
    $tinylang = 'en';
  $hook = $RCMAIL->plugins->exec_hook('hmtl_editor', array('mode' => $mode));
  $OUTPUT->include_script('tiny_mce/tiny_mce.js');
  $OUTPUT->include_script('editor.js');
  $OUTPUT->add_script('rcmail_editor_init("$__skin_path", "'.JQ($tinylang).'", '.intval($CONFIG['enable_spellcheck']).', "'.$mode.'");');
  if ($hook['abort'])
    return;
  $lang = strtolower(substr($_SESSION['language'], 0, 2));
  if (!file_exists(INSTALL_PATH . 'program/js/tiny_mce/langs/'.$lang.'.js'))
    $lang = 'en';
  $RCMAIL->output->include_script('tiny_mce/tiny_mce.js');
  $RCMAIL->output->include_script('editor.js');
  $RCMAIL->output->add_script('rcmail_editor_init("$__skin_path",
    "'.JQ($lang).'", '.intval($CONFIG['enable_spellcheck']).', "'.$mode.'");');
}
/**
 * Check if working in SSL mode
 *
 * @param integer HTTPS port number
 * @param boolean Enables 'use_https' option checking
 */
function rcube_https_check($port=null, $use_https=true)
{
  global $RCMAIL;
  if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off')
    return true;
  if ($port && $_SERVER['SERVER_PORT'] == $port)
    return true;
  if ($use_https && $RCMAIL->config->get('use_https'))
    return true;
  return false;
}
/**
 * E-mail address validation
 */
function check_email($email)
{
  // Check for invalid characters
  if (preg_match('/[\x00-\x1F\x7F-\xFF]/', $email))
    return false;
  // Check that there's one @ symbol, and that the lengths are right
  if (!preg_match('/^([^@]{1,64})@([^@]{1,255})$/', $email, $email_array))
    return false;
  // Check local part
  $local_array = explode('.', $email_array[1]);
  foreach ($local_array as $local_part)
    if (!preg_match('/^(([A-Za-z0-9!#$%&\'*+\/=?^_`{|}~-]+)|("[^"]+"))$/', $local_part))
      return false;
  // Check domain part
  if (preg_match('/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}$/', $email_array[2])
      || preg_match('/^\[(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\]$/', $email_array[2]))
    return true; // If an IP address
  else {
    // If not an IP address
    $domain_array = explode('.', $email_array[2]);
    if (sizeof($domain_array) < 2)
      return false; // Not enough parts to be a valid domain
    foreach ($domain_array as $domain_part)
      if (!preg_match('/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]))$/', $domain_part))
        return false;
    if (!rcmail::get_instance()->config->get('email_dns_check'))
      return true;
    if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && version_compare(PHP_VERSION, '5.3.0', '<'))
      return true;
    // find MX record(s)
    if (getmxrr($email_array[2], $mx_records))
      return true;
    // find any DNS record
    if (checkdnsrr($email_array[2], 'ANY'))
      return true;
  }
  return false;
}
/**
 * Helper class to turn relative urls into absolute ones