From 48d01837a0a5725d2779f30d20478e77572e9ac5 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Mon, 06 Apr 2015 06:00:09 -0400
Subject: [PATCH] Fix tables listing routine on mysql and postgres so it skips system or other database tables and views (#1490337)

---
 CHANGELOG                                |    1 +
 program/lib/Roundcube/rcube_db_mysql.php |   24 ++++++++++++++++++++++++
 program/lib/Roundcube/rcube_db_pgsql.php |   19 +++++++++++++++++++
 program/lib/Roundcube/rcube_db.php       |   11 ++++-------
 4 files changed, 48 insertions(+), 7 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 4282382..d79610b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -10,6 +10,7 @@
 - Fix zipped messages downloads after selecting all messages in a folder (#1490339)
 - Fix vpopmaild driver of password plugin
 - Fix PHP warning: Non-static method PEAR::setErrorHandling() should not be called statically (#1490343)
+- Fix tables listing routine on mysql and postgres so it skips system or other database tables and views (#1490337)
 
 RELEASE 1.1.1
 -------------
diff --git a/program/lib/Roundcube/rcube_db.php b/program/lib/Roundcube/rcube_db.php
index a31b200..4ccc59b 100644
--- a/program/lib/Roundcube/rcube_db.php
+++ b/program/lib/Roundcube/rcube_db.php
@@ -691,14 +691,11 @@
     {
         // get tables if not cached
         if ($this->tables === null) {
-            $q = $this->query('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_NAME');
+            $q = $this->query("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES"
+                . " WHERE TABLE_TYPE = 'BASE TABLE'"
+                . " ORDER BY TABLE_NAME");
 
-            if ($q) {
-                $this->tables = $q->fetchAll(PDO::FETCH_COLUMN, 0);
-            }
-            else {
-                $this->tables = array();
-            }
+            $this->tables = $q ? $q->fetchAll(PDO::FETCH_COLUMN, 0) : array();
         }
 
         return $this->tables;
diff --git a/program/lib/Roundcube/rcube_db_mysql.php b/program/lib/Roundcube/rcube_db_mysql.php
index dd28c25..616d175 100644
--- a/program/lib/Roundcube/rcube_db_mysql.php
+++ b/program/lib/Roundcube/rcube_db_mysql.php
@@ -150,6 +150,30 @@
     }
 
     /**
+     * Returns list of tables in a database
+     *
+     * @return array List of all tables of the current database
+     */
+    public function list_tables()
+    {
+        // get tables if not cached
+        if ($this->tables === null) {
+            // first fetch current database name
+            $d = $this->query("SELECT database()");
+            $d = $this->fetch_array($d);
+
+            // get list of tables in current database
+            $q = $this->query("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES"
+                . " WHERE TABLE_SCHEMA = ? AND TABLE_TYPE = 'BASE TABLE'"
+                . " ORDER BY TABLE_NAME", $d ? $d[0] : '');
+
+            $this->tables = $q ? $q->fetchAll(PDO::FETCH_COLUMN, 0) : array();
+        }
+
+        return $this->tables;
+    }
+
+    /**
      * Get database runtime variables
      *
      * @param string $varname Variable name
diff --git a/program/lib/Roundcube/rcube_db_pgsql.php b/program/lib/Roundcube/rcube_db_pgsql.php
index ff41df2..b425551 100644
--- a/program/lib/Roundcube/rcube_db_pgsql.php
+++ b/program/lib/Roundcube/rcube_db_pgsql.php
@@ -158,6 +158,25 @@
     }
 
     /**
+     * Returns list of tables in a database
+     *
+     * @return array List of all tables of the current database
+     */
+    public function list_tables()
+    {
+        // get tables if not cached
+        if ($this->tables === null) {
+            $q = $this->query("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES"
+                . " WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA NOT IN ('pg_catalog', 'information_schema')"
+                . " ORDER BY TABLE_NAME");
+
+            $this->tables = $q ? $q->fetchAll(PDO::FETCH_COLUMN, 0) : array();
+        }
+
+        return $this->tables;
+    }
+
+    /**
      * Returns PDO DSN string from DSN array
      *
      * @param array $dsn DSN parameters

--
Gitblit v1.9.1