|
|
|
Sponsored Link •
|
|
Advertisement
|
As an example of a stack inspection that results in a denied permission, consider the
Example2b application from the security/ex2 directory of
the CD-ROM:
// On CD-ROM in file security/ex2/Example2b.java
import com.artima.security.friend.Friend;
import com.artima.security.stranger.Stranger;
// This fails because the Stranger code doesn't have
// permission to read file question.txt
class Example2b {
public static void main(String[] args) {
TextFileDisplayer tfd = new TextFileDisplayer("answer.txt");
Friend friend = new Friend(tfd, true);
Stranger stranger = new Stranger(friend, true);
stranger.doYourThing();
}
}
The only difference between Example2b and the previous example,
Example2a, is that whereas Example2a passes the file name
"question.txt" to the TextFileDisplayer constructor,
Example2b passes the file name "answer.txt". This small
change to the application makes a big difference to the outcome of the program, however, because one of
the methods on the stack doesn't have permission to access "answer.txt".
When the Example2b program invokes doYourThing()
on the Stranger object referenced from the stranger variable,
the Stranger object invokes doYourThing() on the
Friend object, which invokes doYourThing() on the
TextFileDisplayer object. TextFileDisplayer's
doYourThing() method attempts to open and read a file named
"answer.txt" in the current directory (the directory in which the
Example2b application was started) and print its contents to the standard output.
When TextFileDisplayer's doYourThing() method
creates a new FileReader object, the FileReader
constructor creates a new FileInputStream, whose constructor checks to see
whether or not a security manager has been installed. In this case, the concrete
SecurityManager has been installed, so the
FileInputStream's constructor invokes checkRead() on the
concrete SecurityManager. The checkRead() method
instantiates a new FilePermission object representing permission to read file
answer.txt and passes that object to the concrete
SecurityManager's checkPermission() method, which
passes the object on to the checkPermission() method of the
AccessController. The AccessController's
checkPermission() method performs the stack inspection to determine whether
this thread should be allowed to open file answer.txt for reading.
The call stack to be inspected in Example2b, which is shown in Figure 3-7, looks
identical to the call stack that was inspected in Example2a. The only difference is that
this time, rather than making sure every frame on the stack has permission to read file
question.txt, the AccessController will make sure every
frame on the stack has permission to read answer.txt. As always, stack inspection
starts at the top of the stack and proceeds on down the stack towards frame one. But this time, the inspection
process never actually reaches frame one. When the AccessController reaches
frame two, it discovers that the code of the Stranger class, to whom the
doYourThing() method of frame two belongs, doesn't have permission to read
"answer.txt". Because all frames of the stack must have permission, the stack
inspection process need go no farther than frame two. The AccessController's
checkPermission() method throws an AccessControl
exception.

Example2b: frame two doesn't have permission.
To get the Example2b application to work as intended, you must start the
application with an appropriate command. When using the java program from the
Java 2 SDK version 1.2, the appropriate command takes the form:
java -Djava.security.manager -Djava.security.policy=policyfile.txt - Dcom.artima.ijvm.cdrom.home=d:\books\InsideJVM\manuscript\cdrom -cp .;jars/friend.jar;jars/stranger.jar Example2b
This command, which is contained in the ex2b.bat file in the
security/ex2 directory of the CD-ROM, is an example of the kind of command
you'll need to use to get the example to work. As before, to execute Example2b on
your own system, you must set the com.artima.ijvm.cdrom.home property to
the security/ex2 directory of your CD-ROM, or to whatever directory you may
have copied the security/ex2 directory from the CD-ROM. When you run this
program, you should see this output:
Exception in thread "main" java.security.AccessControlException: access denied (java.io.FilePermission answer.txt read) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:195) at java.security.AccessController.checkPermission(AccessController.java:403) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.SecurityManager.checkRead(SecurityManager.java:873) at java.io.FileInputStream.(FileInputStream.java:65) at java.io.FileReader. (FileReader.java:35) at TextFileDisplayer.doYourThing(TextFileDisplayer.java, Compiled Code) at com.artima.security.friend.Friend.doYourThing(Friend.java:21) at com.artima.security.stranger.Stranger.doYourThing(Stranger.java:21) at Example2b.main(Example2b.java:18)
|
Sponsored Links
|