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
|