From 1cdcafc7fca95bf06d4c6512aa96ce5d26cfe424 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Fri, 07 Jun 2013 07:12:04 -0400
Subject: [PATCH] Added more error checking in rcube_image::resize()

---
 program/lib/Roundcube/rcube_db.php |   71 ++++++++++++++++++++++++++++-------
 1 files changed, 57 insertions(+), 14 deletions(-)

diff --git a/program/lib/Roundcube/rcube_db.php b/program/lib/Roundcube/rcube_db.php
index f8a9bdc..086fd66 100644
--- a/program/lib/Roundcube/rcube_db.php
+++ b/program/lib/Roundcube/rcube_db.php
@@ -257,8 +257,9 @@
     {
         if ($this->options['debug_mode']) {
             if (($len = strlen($query)) > self::DEBUG_LINE_LENGTH) {
-                $query = substr_replace($query, "\n-----[debug cut]-----\n",
-                    self::DEBUG_LINE_LENGTH/2 - 11, $len - self::DEBUG_LINE_LENGTH - 22);
+                $diff  = $len - self::DEBUG_LINE_LENGTH;
+                $query = substr($query, 0, self::DEBUG_LINE_LENGTH)
+                    . "... [truncated $diff bytes]";
             }
             rcube::write_log('sql', '[' . (++$this->db_index) . '] ' . $query . ';');
         }
@@ -414,13 +415,16 @@
 
         if ($result === false) {
             $error = $this->dbh->errorInfo();
-            $this->db_error = true;
-            $this->db_error_msg = sprintf('[%s] %s', $error[1], $error[2]);
 
-            rcube::raise_error(array('code' => 500, 'type' => 'db',
-                'line' => __LINE__, 'file' => __FILE__,
-                'message' => $this->db_error_msg . " (SQL Query: $query)"
-                ), true, false);
+            if (empty($this->options['ignore_key_errors']) || $error[0] != '23000') {
+                $this->db_error = true;
+                $this->db_error_msg = sprintf('[%s] %s', $error[1], $error[2]);
+
+                rcube::raise_error(array('code' => 500, 'type' => 'db',
+                    'line' => __LINE__, 'file' => __FILE__,
+                    'message' => $this->db_error_msg . " (SQL Query: $query)"
+                    ), true, false);
+            }
         }
 
         $this->last_result = $result;
@@ -707,11 +711,19 @@
     /**
      * Return SQL function for current time and date
      *
+     * @param int $interval Optional interval (in seconds) to add/subtract
+     *
      * @return string SQL function to use in query
      */
-    public function now()
+    public function now($interval = 0)
     {
-        return "now()";
+        if ($interval) {
+            $add = ' ' . ($interval > 0 ? '+' : '-') . ' INTERVAL ';
+            $add .= $interval > 0 ? intval($interval) : intval($interval) * -1;
+            $add .= ' SECONDS';
+        }
+
+        return "now()" . $add;
     }
 
     /**
@@ -794,12 +806,19 @@
     /**
      * Encodes non-UTF-8 characters in string/array/object (recursive)
      *
-     * @param mixed $input Data to fix
+     * @param mixed $input      Data to fix
+     * @param bool  $serialized Enable serialization
      *
      * @return mixed Properly UTF-8 encoded data
      */
-    public static function encode($input)
+    public static function encode($input, $serialized = false)
     {
+        // use Base64 encoding to workaround issues with invalid
+        // or null characters in serialized string (#1489142)
+        if ($serialized) {
+            return base64_encode(serialize($input));
+        }
+
         if (is_object($input)) {
             foreach (get_object_vars($input) as $idx => $value) {
                 $input->$idx = self::encode($value);
@@ -810,6 +829,7 @@
             foreach ($input as $idx => $value) {
                 $input[$idx] = self::encode($value);
             }
+
             return $input;
         }
 
@@ -819,12 +839,24 @@
     /**
      * Decodes encoded UTF-8 string/object/array (recursive)
      *
-     * @param mixed $input Input data
+     * @param mixed $input      Input data
+     * @param bool  $serialized Enable serialization
      *
      * @return mixed Decoded data
      */
-    public static function decode($input)
+    public static function decode($input, $serialized = false)
     {
+        // use Base64 encoding to workaround issues with invalid
+        // or null characters in serialized string (#1489142)
+        if ($serialized) {
+            // Keep backward compatybility where base64 wasn't used
+            if (strpos(substr($input, 0, 16), ':') !== false) {
+                return self::decode(@unserialize($input));
+            }
+
+            return @unserialize(base64_decode($input));
+        }
+
         if (is_object($input)) {
             foreach (get_object_vars($input) as $idx => $value) {
                 $input->$idx = self::decode($value);
@@ -861,6 +893,17 @@
     }
 
     /**
+     * Set class option value
+     *
+     * @param string $name  Option name
+     * @param mixed  $value Option value
+     */
+    public function set_option($name, $value)
+    {
+        $this->options[$name] = $value;
+    }
+
+    /**
      * MDB2 DSN string parser
      *
      * @param string $sequence Secuence name

--
Gitblit v1.9.1