I am working on an issue with an old version of Cloudscape where creating a table under security manager fails unless the user code is given read access to the database directory. What I found was that the test case:

- Failed with Cloudscape 5.1.60 on create table unless I added read permissions for the database directory with: java.security.AccessControlException: access denied (java.io.FilePermission C:\db\test\seg0 read)

- Regressed Further with 10.0.2.2.349072 and failed even with read permissions on the database directory with: ERROR XBM02: Startup failed due to missing functionality for org.apache.derby.iapi.services.stream.InfoStreams. (Not sure what the issue was here, but granting all permissions to user code did the trick #:)

- Passes with 10.1.3.1 - (417277)   and 10.2.0.5 - (429411)

Looking at our derby_tests.policy I don't think this case where the user code does not have read access to the database is covered because we have this:

 // Access all files under ${user.dir}to write the test directory structure
 permission java.io.FilePermission "${user.dir}${/}-", "read,write,delete";

which I think includes the database directory.  Is that correct?

I was thinking I would make a Jira issue to cover the case where the user code does not have read access to the database directory but wanted to check that I understood this correctly. Also I understand that given our current harness, this might be a difficult change, but was wondering if it might be more feasible in the JUnit world.

Below is the test case information for those with more than the typical interest. Again this all passes fine now with Derby 10.1.3.1. This is just a question of test coverage.


Thanks

Kathey

ij> connect 'jdbc:derby:c:/db/test;create=true';
ij> CREATE TABLE TESTTABLE2 (COL INT);
0 rows inserted/updated/deleted

java -Dcodebase=C:/marsden/releases/10.2.0.5.429411 -Djava.security.manager -Djava.security.policy=my.policy test.DerbySecurityTest
started
Executing statement: INSERT INTO TESTTABLE2 VALUES (37)
Executing statement: CREATE TABLE TESTTABLE (C INT)
Executing statement: DROP TABLE TESTTABLE
done
$

my.policy

// permissions for derby  code base:
grant codeBase "file:${codebase}/-" {
 permission java.security.AllPermission;
};
// No permissions for user code.

DerbySecurityTest

/*
* Created on Aug 2, 2006
*
*/
package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.SQLException;

public class DerbySecurityTest {

   public static void main(String[] args) throws Exception{
       try {
           System.out.println("started");
           String dbName = "jdbc:derby:c:/db/test";
           if (args.length > 0) {
               dbName = args[0];
           }

           Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
           Connection conn = DriverManager.getConnection(dbName);
String[] statements = new String[] { "INSERT INTO TESTTABLE2 VALUES (37)", "CREATE TABLE TESTTABLE (C INT)", "DROP TABLE TESTTABLE" };
           for (int i = 0; i < statements.length; i++) {
               System.out.println("Executing statement: " + statements[i]);
               final String statementString = statements[i];
               final Statement stat = conn.createStatement();
               stat.execute(statementString);
           }
           System.out.println("done");
       } catch (SQLException  exc) {
           do {
               exc.printStackTrace();
               exc = exc.getNextException();
           } while (exc != null);
       }
   }
}



Reply via email to