1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-16 06:01:02 +03:00

Fix bug in reading acls (didn't treat null acl as meaning the table owner had

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
This commit is contained in:
Barry Lind
2003-03-24 03:48:32 +00:00
parent 0489783011
commit 1e3372e6bb
2 changed files with 16 additions and 6 deletions

View File

@ -2466,7 +2466,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
byte column[] = rs.getBytes("attname"); byte column[] = rs.getBytes("attname");
String owner = rs.getString("usename"); String owner = rs.getString("usename");
String acl = rs.getString("relacl"); String acl = rs.getString("relacl");
Hashtable permissions = parseACL(acl); Hashtable permissions = parseACL(acl, owner);
String permNames[] = new String[permissions.size()]; String permNames[] = new String[permissions.size()];
Enumeration e = permissions.keys(); Enumeration e = permissions.keys();
int i=0; int i=0;
@ -2569,7 +2569,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
byte table[] = rs.getBytes("relname"); byte table[] = rs.getBytes("relname");
String owner = rs.getString("usename"); String owner = rs.getString("usename");
String acl = rs.getString("relacl"); String acl = rs.getString("relacl");
Hashtable permissions = parseACL(acl); Hashtable permissions = parseACL(acl, owner);
String permNames[] = new String[permissions.size()]; String permNames[] = new String[permissions.size()];
Enumeration e = permissions.keys(); Enumeration e = permissions.keys();
int i=0; int i=0;
@ -2693,7 +2693,11 @@ public abstract class AbstractJdbc1DatabaseMetaData
* a Hashtable mapping the SQL permission name to a Vector of * a Hashtable mapping the SQL permission name to a Vector of
* usernames who have that permission. * 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); Vector acls = parseACLArray(aclArray);
Hashtable privileges = new Hashtable(); Hashtable privileges = new Hashtable();
for (int i=0; i<acls.size(); i++) { for (int i=0; i<acls.size(); i++) {

View File

@ -9,7 +9,7 @@ import java.sql.*;
* *
* PS: Do you know how difficult it is to type on a train? ;-) * 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 public class DatabaseMetaDataTest extends TestCase
@ -237,13 +237,19 @@ public class DatabaseMetaDataTest extends TestCase
public void testTablePrivileges() public void testTablePrivileges()
{ {
// At the moment just test that no exceptions are thrown KJ
try try
{ {
DatabaseMetaData dbmd = con.getMetaData(); DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd); 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(); 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) { } catch (SQLException sqle) {
sqle.printStackTrace(); sqle.printStackTrace();
fail(sqle.getMessage()); fail(sqle.getMessage());