alecpl
2010-04-01 70318e5463986edff014e881e7e121483679726b
program/include/main.inc
@@ -209,13 +209,14 @@
  // convert charset using iconv module  
  if (function_exists('iconv') && $from != 'UTF-7' && $to != 'UTF-7') {
    if ($iconv_options === null) {
      // transliterate characters not available in output charset
      $iconv_options = '//TRANSLIT';
      // ignore characters not available in output charset
      $iconv_options = '//IGNORE';
      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);
@@ -748,6 +749,9 @@
    foreach ($table_data as $row_data)
    {
      $zebra_class = $c % 2 ? 'even' : 'odd';
      if (!empty($row_data['class']))
        $zebra_class .= ' '.$row_data['class'];
      $table->add_row(array('id' => 'rcmrow' . $row_data[$id_col], 'class' => $zebra_class));
      // format each col
@@ -1505,48 +1509,59 @@
/**
 * E-mail address validation
 */
function check_email($email)
function check_email($email, $dns_check=true)
{
  // 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))
  // Check for length limit specified by RFC 5321 (#1486453)
  if (strlen($email) > 254)
    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;
  $email_array = explode('@', $email);
  // Check that there's one @ symbol
  if (count($email_array) < 2)
    return false;
  $domain_part = array_pop($email_array);
  $local_part = implode('@', $email_array);
  // from PEAR::Validate
  $regexp = '&^(?:
   ("\s*(?:[^"\f\n\r\t\v\b\s]+\s*)+")|              #1 quoted name
   ([-\w!\#\$%\&\'*+~/^`|{}]+(?:\.[-\w!\#\$%\&\'*+~/^`|{}]+)*))    #2 OR dot-atom
   $&xi';
  if (!preg_match($regexp, $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
  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}\]*$/', $domain_part))
    return true; // IP address
  else {
    // If not an IP address
    $domain_array = explode('.', $email_array[2]);
    $domain_array = explode('.', $domain_part);
    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))
    foreach ($domain_array as $part)
      if (!preg_match('/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]))$/', $part))
        return false;
    if (!rcmail::get_instance()->config->get('email_dns_check'))
    if (!$dns_check || !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))
    if (getmxrr($domain_part, $mx_records))
      return true;
    // find any DNS record
    if (checkdnsrr($email_array[2], 'ANY'))
    if (checkdnsrr($domain_part, 'ANY'))
      return true;
  }