From 0f3764e59223d8e9c87f30ce85425c00422ff25d Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Tue, 27 Apr 2010 09:01:12 -0400
Subject: [PATCH] - add DNS checking code for Windows & PHP<5.3.0

---
 program/include/main.inc |   91 ++++++++++++++++++++++++++++++++-------------
 1 files changed, 65 insertions(+), 26 deletions(-)

diff --git a/program/include/main.inc b/program/include/main.inc
index 46f5a70..004212f 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -30,7 +30,6 @@
 require_once('include/rcube_shared.inc');
 
 // fallback if not PHP modules are available
-@include_once('lib/des.inc');
 @include_once('lib/utf8.class.php');
 
 // define constannts for input reading
@@ -209,8 +208,8 @@
   // 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 = '';
@@ -326,9 +325,13 @@
  * @param  string  Input charset name
  * @return The validated charset name
  */
-function rcube_parse_charset($charset)
+function rcube_parse_charset($input)
   {
-  $charset = strtoupper($charset);
+  static $charsets = array();
+  $charset = strtoupper($input);
+
+  if (isset($charsets[$input]))
+    return $charsets[$input];
 
   $charset = preg_replace(array(
     '/^[^0-9A-Z]+/',	// e.g. _ISO-8859-JP$SIO
@@ -368,24 +371,28 @@
   $str = preg_replace(array('/[^A-Z0-9]/', '/^X+/'), '', $charset);
 
   if (isset($aliases[$str]))
-    return $aliases[$str];
-
-  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)) {
+    $result = $aliases[$str];
+  // UTF
+  else if (preg_match('/U[A-Z][A-Z](7|8|16|32)(BE|LE)*/', $str, $m))
+    $result = 'UTF-' . $m[1] . $m[2];
+  // ISO-8859
+  else if (preg_match('/ISO8859([0-9]{0,2})/', $str, $m)) {
     $iso = 'ISO-8859-' . ($m[1] ? $m[1] : 1);
-    # 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;
+    // some clients sends windows-1252 text as latin1,
+    // it is safe to use windows-1252 for all latin1
+    $result = $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];
+  else if (preg_match('/(WIN|WINDOWS)([0-9]+)/', $str, $m)) {
+    $result = 'WINDOWS-' . $m[2];
+    }
+  else {
+    $result = $charset;
     }
 
-  return $charset;
+  $charsets[$input] = $result;
+
+  return $result;
   }
 
 
@@ -735,9 +742,6 @@
     while ($table_data && ($sql_arr = $db->fetch_assoc($table_data)))
     {
       $zebra_class = $c % 2 ? 'even' : 'odd';
-      if (!empty($row_data['class']))
-        $zebra_class .= ' '.$row_data['class'];
-
       $table->add_row(array('id' => 'rcmrow' . $sql_arr[$id_col], 'class' => $zebra_class));
 
       // format each col
@@ -1137,6 +1141,34 @@
 
 
 /**
+ * Write login data (name, ID, IP address) to the 'userlogins' log file.
+ */
+function rcmail_log_login()
+{
+  global $RCMAIL;
+
+  if (!$RCMAIL->config->get('log_logins') || !$RCMAIL->user)
+    return;
+
+  $address = $_SERVER['REMOTE_ADDR'];
+  // append the NGINX X-Real-IP header, if set
+  if (!empty($_SERVER['HTTP_X_REAL_IP'])) {
+    $remote_ip[] = 'X-Real-IP: ' . $_SERVER['HTTP_X_REAL_IP'];
+  }
+  // append the X-Forwarded-For header, if set
+  if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
+    $remote_ip[] = 'X-Forwarded-For: ' . $_SERVER['HTTP_X_FORWARDED_FOR'];
+  }
+
+  if (!empty($remote_ip))
+    $address .= '(' . implode(',', $remote_ip) . ')';
+
+  write_log('userlogins', sprintf('Successful login for %s (ID: %d) from %s',
+    $RCMAIL->user->get_username(), $RCMAIL->user->ID, $address));
+}
+
+
+/**
  * @access private
  */
 function rcube_timer()
@@ -1427,15 +1459,15 @@
 {
   global $CONFIG;
 
+  if ($folder_id == 'INBOX')
+    return 'inbox';
+
   // for these mailboxes we have localized labels and css classes
   foreach (array('sent', 'drafts', 'trash', 'junk') as $smbx)
   {
     if ($folder_id == $CONFIG[$smbx.'_mbox'])
       return $smbx;
   }
-
-  if ($folder_id == 'INBOX')
-    return 'inbox';
 }
 
 
@@ -1556,8 +1588,15 @@
     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;
+    if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && version_compare(PHP_VERSION, '5.3.0', '<')) {
+      $lookup = array();
+      @exec("nslookup -type=MX " . escapeshellarg($domain_part) . " 2>&1", $lookup);
+      foreach ($lookup as $line) {
+        if (strpos($line, 'MX preference'))
+          return true;
+      }
+      return false;
+    }
 
     // find MX record(s)
     if (getmxrr($domain_part, $mx_records))

--
Gitblit v1.9.1