From ad399a95dded2a0378eb410569dcac65c3c9c44a Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Thu, 09 Dec 2010 04:26:54 -0500
Subject: [PATCH] - Add username and IP address to log message on unsuccessful login (#1487626)

---
 CHANGELOG                              |    1 +
 program/include/main.inc               |   42 +++++++++++++++++++++++++++---------------
 program/include/rcube_imap.php         |    8 ++++++--
 program/include/rcube_imap_generic.php |    2 +-
 4 files changed, 35 insertions(+), 18 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 1ce37f2..85b65ef 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -19,6 +19,7 @@
 - Better support for READ-ONLY and NOPERM responses handling (#1487083)
 - Add confirmation message on purge/expunge command response
 - Fix handling of untagged responses for AUTHENTICATE command (#1487450)
+- Add username and IP address to log message on unsuccessful login (#1487626)
 
 RELEASE 0.5-BETA
 ----------------
diff --git a/program/include/main.inc b/program/include/main.inc
index 160c835..a9a96a0 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -1193,21 +1193,33 @@
   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));
+    $RCMAIL->user->get_username(), $RCMAIL->user->ID, rcmail_remote_ip()));
+}
+
+
+/**
+ * Returns remote IP address and forwarded addresses if found
+ *
+ * @return string Remote IP address(es)
+ */
+function rcmail_remote_ip()
+{
+    $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) . ')';
+
+    return $address;
 }
 
 
@@ -1219,7 +1231,7 @@
 {
   return microtime(true);
 }
-  
+
 
 /**
  * @access private
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index d1947c4..83c34bc 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -172,10 +172,14 @@
         }
         // write error log
         else if ($this->conn->error) {
-            if ($pass && $user)
+            if ($pass && $user) {
+                $message = sprintf("Login failed for %s from %s. %s",
+                    $user, rcmail_remote_ip(), $this->conn->error);
+
                 raise_error(array('code' => 403, 'type' => 'imap',
                     'file' => __FILE__, 'line' => __LINE__,
-                    'message' => $this->conn->error), true, false);
+                    'message' => $message), true, false);
+            }
         }
 
         return false;
diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php
index e721353..be3cc7e 100644
--- a/program/include/rcube_imap_generic.php
+++ b/program/include/rcube_imap_generic.php
@@ -533,7 +533,7 @@
             return $this->fp;
         }
         else {
-            $this->setError($result, "Unable to authenticate user ($type): $line");
+            $this->setError($result, "AUTHENTICATE $type: $line");
         }
 
         return $result;

--
Gitblit v1.9.1