]> granicus.if.org Git - postgresql/commitdiff
Fix bug in reading acls (didn't treat null acl as meaning the table owner had
authorBarry Lind <barry@xythos.com>
Mon, 24 Mar 2003 03:48:32 +0000 (03:48 +0000)
committerBarry Lind <barry@xythos.com>
Mon, 24 Mar 2003 03:48:32 +0000 (03:48 +0000)
full privs), also updated the regression test for this case.

 Modified Files:
  jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
  jdbc/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java

src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java
src/interfaces/jdbc/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java

index 328079ce514736f72d3e7b2da00f53889ae2712e..98af4ce9838a986a8edb93f2a2f4202944abee21 100644 (file)
@@ -2466,7 +2466,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
                        byte column[] = rs.getBytes("attname");
                        String owner = rs.getString("usename");
                        String acl = rs.getString("relacl");
-                       Hashtable permissions = parseACL(acl);
+                       Hashtable permissions = parseACL(acl, owner);
                        String permNames[] = new String[permissions.size()];
                        Enumeration e = permissions.keys();
                        int i=0;
@@ -2569,7 +2569,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
                        byte table[] = rs.getBytes("relname");
                        String owner = rs.getString("usename");
                        String acl = rs.getString("relacl");
-                       Hashtable permissions = parseACL(acl);
+                       Hashtable permissions = parseACL(acl, owner);
                        String permNames[] = new String[permissions.size()];
                        Enumeration e = permissions.keys();
                        int i=0;
@@ -2693,7 +2693,11 @@ public abstract class AbstractJdbc1DatabaseMetaData
         * a Hashtable mapping the SQL permission name to a Vector of
         * usernames who have that permission.
         */
-       protected Hashtable parseACL(String aclArray) {
+       protected Hashtable parseACL(String aclArray, String owner) {
+               if (aclArray == null || aclArray == "") {
+                       //null acl is a shortcut for owner having full privs
+                       aclArray = "{" + owner + "=arwdRxt}";
+               }
                Vector acls = parseACLArray(aclArray);
                Hashtable privileges = new Hashtable();
                for (int i=0; i<acls.size(); i++) {
index 9ee4c0ab50cae1a56613f3443b025ec806364406..faf23a5c85e6477a91c7d116e01e83d9a59820e2 100644 (file)
@@ -9,7 +9,7 @@ import java.sql.*;
  *
  * PS: Do you know how difficult it is to type on a train? ;-)
  *
- * $Id: DatabaseMetaDataTest.java,v 1.16 2002/11/11 07:11:12 barry Exp $
+ * $Id: DatabaseMetaDataTest.java,v 1.17 2003/03/24 03:48:32 barry Exp $
  */
 
 public class DatabaseMetaDataTest extends TestCase
@@ -237,13 +237,19 @@ public class DatabaseMetaDataTest extends TestCase
 
        public void testTablePrivileges()
        {
-               // At the moment just test that no exceptions are thrown KJ
                try
                {
                        DatabaseMetaData dbmd = con.getMetaData();
                        assertNotNull(dbmd);
-                       ResultSet rs = dbmd.getTablePrivileges(null,null,"grantme");
+                       ResultSet rs = dbmd.getTablePrivileges(null,null,"testmetadata");
+                       boolean l_foundSelect = false;
+                       while (rs.next()) {
+                               if (rs.getString("GRANTEE").equals(TestUtil.getUser()) 
+                                       && rs.getString("PRIVILEGE").equals("SELECT")) l_foundSelect = true; 
+                       }
                        rs.close();
+                       //Test that the table owner has select priv
+                       assertTrue("Couldn't find SELECT priv on table testmetadata for " + TestUtil.getUser(),l_foundSelect);
                } catch (SQLException sqle) {
                        sqle.printStackTrace();
                        fail(sqle.getMessage());