OSDN Git Service

* Makefile.in: Rebuilt.
[pf3gnuchains/gcc-fork.git] / libjava / java / lang / SecurityManager.java
index 9c14552..345bb22 100644 (file)
-/* Copyright (C) 1998, 1999  Free Software Foundation
+/* java.lang.SecurityManager
+   Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
 
-   This file is part of libgcj.
+This file is part of GNU Classpath.
 
-This software is copyrighted work licensed under the terms of the
-Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
-details.  */
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+As a special exception, if you link this library with other files to
+produce an executable, this library does not by itself cause the
+resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why the
+executable file might be covered by the GNU General Public License. */
 
-// SecurityManager
 
 package java.lang;
 
+import java.net.*;
+import java.util.*;
+import java.io.*;
+
 /**
- * @author Anthony Green <green@cygnus.com>
- * @date October 5, 1998.  
- */
+ ** SecurityManager is a class you can extend to create
+ ** your own Java security policy.  By default, there is
+ ** no SecurityManager installed in 1.1, which means that
+ ** all things are permitted to all people.<P>
+ **
+ ** The default methods in this class deny all
+ ** things to all people.
+ **
+ ** @author  John Keiser
+ ** @version 1.1.0, 31 May 1998
+ ** @since JDK1.0
+ **/
+public class SecurityManager {
+       /** Tells whether or not the SecurityManager is currently
+        ** performing a security check.
+        **/
+       protected boolean inCheck;
+
+       /** Tells whether or not the SecurityManager is currently
+        ** performing a security check.
+        **
+        ** @return whether or not the SecurityManager is
+        **         currently performing a security check.
+        **/
+       public boolean getInCheck() {
+               return inCheck;
+       }
 
-/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
- */
+       /** Get a list of all the classes currently executing
+        ** methods on the Java stack.  getClassContext()[0] is
+        ** the currently executing method
+        ** <STRONG>Spec Note:</STRONG> does not say whether
+        ** the stack will include the getClassContext() call or
+        ** the one just before it.
+        **
+        ** @return an array containing all the methods on classes
+        **         on the Java execution stack.
+        **/
+       protected Class[] getClassContext() {
+               return VMSecurityManager.getClassContext();
+       }
 
-import java.io.*;
-import java.net.*;
+       /** Find the ClassLoader for the most recent class on the
+        ** stack that was loaded by an explicit ClassLoader.  If
+        ** everything on the stack was loaded by the system
+        ** classloader, null is returned.
+        **
+        ** @return the most recent ClassLoader on the execution
+        **         stack.
+        **/
+       protected ClassLoader currentClassLoader() {
+               return VMSecurityManager.currentClassLoader();
+       }
+
+       /** Find the most recent class on the stack that was
+        ** loaded by an explicit ClassLoader.  If everything on
+        ** the stack was loaded by the system classloader, null
+        ** is returned.
+        **
+        ** @return the most recent loaded Class on the execution
+        **         stack.
+        **/
+       protected Class currentLoadedClass() {
+               Class[] c = getClassContext();
+               for(int i=0;i<c.length;i++) {
+                       if(c[i].getClassLoader() != null) {
+                               return c[i];
+                       }
+               }
+               return null;
+       }
+
+       /** Get the depth on the execution stack of the most
+        ** recent class that was loaded by an explicit
+        ** ClassLoader.  This can be used as an index into
+        ** getClassContext().
+        **
+        ** @return the index of the most recent loaded Class on
+        **         the execution stack.
+        **/
+       protected int classLoaderDepth() {
+               Class[] c = getClassContext();
+               for(int i=0;i<c.length;i++) {
+                       if(c[i].getClassLoader() != null) {
+                               return i;
+                       }
+               }
+               return -1;
+       }
+
+       /** Tell whether there is a class loaded with an explicit
+        ** ClassLoader on the stack.
+        **
+        ** @return whether there is a class loaded with an
+        **         explicit ClassLoader on the stack.
+        **/
+       protected boolean inClassLoader() {
+               return classLoaderDepth() != -1;
+       }
+
+
+       /** Get the depth of a particular class on the execution
+        ** stack.
+        **
+        ** @param className the fully-qualified name of the class
+        **        to search for on the stack.
+        ** @return the index of the class on the stack, or -1 if
+        **         the class is not on the stack.
+        **/
+       protected int classDepth(String className) {
+               Class[] c = getClassContext();
+               for(int i=0;i<c.length;i++) {
+                       if(className.equals(c[i].getName())) {
+                               return i;
+                       }
+               }
+               return -1;
+       }
+
+       /** Tell whether the specified class is on the execution
+        ** stack.
+        **
+        ** @param className the fully-qualified name of the class
+        **        to search for on the stack.
+        ** @return whether the specified class is on the
+        **         execution stack.
+        **/
+       protected boolean inClass(String className) {
+               return classDepth(className) != -1;
+       }
+
+       /** Get an implementation-dependent Object that contains
+        ** enough information about the current environment to be
+        ** able to perform standard security checks later.  This
+        ** is used by trusted methods that need to verify that
+        ** their callers have sufficient access to perform
+        ** certain operations.<P>
+        **
+        ** Currently the only methods that use this are checkRead()
+        ** and checkConnect().
+        **
+        ** @see checkConnect(java.lang.String,int,java.lang.Object)
+        ** @see checkRead(java.lang.String,java.lang.Object)
+        **/
+       public Object getSecurityContext() {
+               return new SecurityContext(getClassContext());
+       }
 
-public abstract class SecurityManager
-{
-  protected boolean inCheck = false;
-
-  public void checkAccept (String host, int port)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkAccess (Thread thrd)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkAccess (ThreadGroup thrdGroup)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkAwtEventQueueAccess ()
-    {
-      throw new SecurityException();
-    }
-
-  public void checkConnect (String host, int prt)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkConnect (String host, int prt, Object ctx)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkCreateClassLoader ()
-    {
-      throw new SecurityException();
-    }
-
-  public void checkDelete (String fileName)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkExec (String prog)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkExit (int stat)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkLink (String lib)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkListen (int lport)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkMemberAccess (Class cl, int mtype)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkMulticast (InetAddress maddr)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkMulticast (InetAddress maddr, byte ttl)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkPackageAccess (String pkg)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkPackageDefinition (String pkg)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkPermission (java.security.Permission perm)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkPrintJobAccess ()
-    {
-      throw new SecurityException();
-    }
-
-  public void checkPropertiesAccess ()
-    {
-      throw new SecurityException();
-    }
-
-  public void checkPropertyAccess (String prop)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkPropertyAccess (String prop, String defval)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkRead (FileDescriptor fd)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkRead (String fileName)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkRead (String fileName, Object ctx)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkSecurityAccess (String action)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkSetFactory ()
-    {
-      throw new SecurityException();
-    }
-
-  public void checkSystemClipboardAccess ()
-    {
-      throw new SecurityException();
-    }
-
-  public boolean checkTopLevelWindow (Object window)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkWrite (FileDescriptor fd)
-    {
-      throw new SecurityException();
-    }
-
-  public void checkWrite (String fileName)
-    {
-      throw new SecurityException();
-    }
-
-  // Note: this method is deprecated in JDK 1.2
-  protected /* native */ int classDepth (String className)
-    {
-      Class[] classStack = getClassContext ();
-      for (int i = 0; i < classStack.length; i++)
-       if (classStack[i].getName().compareTo(className) == 0)
-         return i;
-
-      return -1;
-    }
-
-  // Note: this method is deprecated in JDK 1.2
-  protected /* native */ int classLoaderDepth ()
-    {
-      Class[] classStack = getClassContext ();
-      for (int i = 0; i < classStack.length; i++)
-       if (classStack[i].getClassLoader() != null)
-         return i;
-
-      return -1;
-    }
-
-  protected /* native */ ClassLoader currentClassLoader ()
-    {
-      Class[] classStack = getClassContext ();
-      for (int i = 0; i < classStack.length; i++)
-       {
-         ClassLoader loader = classStack[i].getClassLoader();
-         if (loader != null)
-           return loader;
-       }
-
-      return null;
-    }
-
-  protected /* native */ Class currentLoadedClass ()
-    {
-      Class[] classStack = getClassContext ();
-      for (int i = 0; i < classStack.length; i++)
-       {
-         ClassLoader loader = classStack[i].getClassLoader();
-         if (loader != null)
-           return classStack[i];
-       }
-      
-      return null;
-    }
-
-  protected /* native */ Class[] getClassContext ()
-    {
-      return new Class[0];
-    }
-
-  // Note: this method is deprecated in JDK 1.2
-  public boolean getInCheck ()
-    {
-      return inCheck;
-    }
-
-  public Object getSecurityContext ()
-    {
-      // FIXME: This has yet to be implemented.
-      return new String("");
-    }
-
-  public ThreadGroup getThreadGroup ()
-    {
-      return Thread.currentThread().getThreadGroup();
-    }
-
-  protected boolean inClass (String className)
-    {
-      return (classDepth (className) != -1);
-    }
-
-  protected boolean inClassLoader ()
-    {
-      return (classLoaderDepth () != -1);
-    }
-
-  protected SecurityManager ()
-    {
-      if (System.getSecurityManager () != null)
-       throw new SecurityException ();
-    }
+       /** Check if the current thread is allowed to create a
+        ** ClassLoader.<P>
+        **
+        ** This method is called from ClassLoader.ClassLoader(),
+        ** in other words, whenever a ClassLoader is created.<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.lang.ClassLoader#ClassLoader()
+        **/
+       public void checkCreateClassLoader() {
+               throw new SecurityException("Cannot create new ClassLoaders.");
+       }
+
+       /** Check if the current thread is allowed to modify this
+        ** other Thread.<P>
+        **
+        ** Called by Thread.stop(), suspend(), resume(), and
+        ** interrupt(), destroy(), setPriority(), setName() and
+        ** setDaemon().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param g the Thread to check against
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.lang.Thread#stop()
+        ** @see java.lang.Thread#suspend()
+        ** @see java.lang.Thread#resume()
+        ** @see java.lang.Thread#interrupt()
+        ** @see java.lang.Thread#destroy()
+        ** @see java.lang.Thread#setPriority(int)
+        ** @see java.lang.Thread#setName(java.lang.String)
+        ** @see java.lang.Thread#setDaemon(boolean)
+        **/
+       public void checkAccess(Thread t) {
+               throw new SecurityException("Cannot modify Threads.");
+       }
+
+       /** Check if the current thread is allowed to modify this
+        ** ThreadGroup.<P>
+        **
+        ** Called by Thread.Thread() (to add a thread to the
+        ** ThreadGroup), ThreadGroup.ThreadGroup() (to add this
+        ** ThreadGroup to a parent), ThreadGroup.stop(),
+        ** suspend(), resume(), interrupt(), destroy(),
+        ** setDaemon(), and setMaxPriority().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param g the ThreadGroup to check against
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.lang.Thread#Thread()
+        ** @see java.lang.ThreadGroup#ThreadGroup()
+        ** @see java.lang.ThreadGroup#stop()
+        ** @see java.lang.ThreadGroup#suspend()
+        ** @see java.lang.ThreadGroup#resume()
+        ** @see java.lang.ThreadGroup#interrupt()
+        ** @see java.lang.ThreadGroup#setDaemon(boolean)
+        ** @see java.lang.ThreadGroup#setMaxPriority(int)
+        **/
+       public void checkAccess(ThreadGroup g) {
+               throw new SecurityException("Cannot modify ThreadGroups.");
+       }
+
+       /** Check if the current thread is allowed to exit the
+        ** JVM with the given status.<P>
+        **
+        ** This method is called from Runtime.exit().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param status the status to exit with
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.lang.Runtime#exit()
+        ** @see java.lang.Runtime#exit(int)
+        **/
+       public void checkExit(int status) {
+               throw new SecurityException("Cannot exit JVM.");
+       }
+
+       /** Check if the current thread is allowed to execute the
+        ** given program.<P>
+        **
+        ** This method is called from Runtime.exec().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param program the name of the program to exec
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.lang.Runtime#exec(java.lang.String[],java.lang.String[])
+        **/
+       public void checkExec(String program) {
+               throw new SecurityException("Cannot execute programs.");
+       }
+
+       /** Check if the current thread is allowed to link in the
+        ** given native library.<P>
+        **
+        ** This method is called from Runtime.load() (and hence,
+        ** by loadLibrary() as well).<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param filename the full name of the library to load
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.lang.Runtime#load(java.lang.String)
+        **/
+       public void checkLink(String filename) {
+               throw new SecurityException("Cannot link native libraries.");
+       }
+
+       /** Check if the current thread is allowed to read the
+        ** given file using the FileDescriptor.<P>
+        **
+        ** This method is called from
+        ** FileInputStream.FileInputStream().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param desc the FileDescriptor representing the file
+        **        to access
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.io.FileInputStream#FileInputStream(java.io.FileDescriptor)
+        **/
+       public void checkRead(FileDescriptor desc) {
+               throw new SecurityException("Cannot read files via file descriptors.");
+       }
+
+       /** Check if the current thread is allowed to read the
+        ** given file.<P>
+        **
+        ** This method is called from
+        ** FileInputStream.FileInputStream(),
+        ** RandomAccessFile.RandomAccessFile(), File.exists(),
+        ** canRead(), isFile(), isDirectory(), lastModified(),
+        ** length() and list().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param filename the full name of the file to access
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.io.File
+        ** @see java.io.FileInputStream#FileInputStream(java.lang.String)
+        ** @see java.io.RandomAccessFile#RandomAccessFile(java.lang.String)
+        **/
+       public void checkRead(String filename) {
+               throw new SecurityException("Cannot read files via file names.");
+       }
+
+       /** Check if the current thread is allowed to read the
+        ** given file. using the given SecurityContext.<P>
+        **
+        ** I know of no core class that calls this method.<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param filename the full name of the file to access
+        ** @param securityContext the Security Context to
+        **        determine access for.
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        **/
+       public void checkRead(String filename, Object securityContext) {
+               throw new SecurityException("Cannot read files via file names.");
+       }
+
+       /** Check if the current thread is allowed to write to the
+        ** given file using the FileDescriptor.<P>
+        **
+        ** This method is called from
+        ** FileOutputStream.FileOutputStream().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param desc the FileDescriptor representing the file
+        **        to access
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.io.FileOutputStream#FileOutputStream(java.io.FileDescriptor)
+        **/
+       public void checkWrite(FileDescriptor desc) {
+               throw new SecurityException("Cannot write files via file descriptors.");
+       }
+
+       /** Check if the current thread is allowed to write to the
+        ** given file.<P>
+        **
+        ** This method is called from
+        ** FileOutputStream.FileOutputStream(),
+        ** RandomAccessFile.RandomAccessFile(),
+        ** File.canWrite(), mkdir(), and renameTo().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param filename the full name of the file to access
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.io.File#canWrite()
+        ** @see java.io.File#mkdir()
+        ** @see java.io.File#renameTo()
+        ** @see java.io.FileOutputStream#FileOutputStream(java.lang.String)
+        ** @see java.io.RandomAccessFile#RandomAccessFile(java.lang.String)
+        **/
+       public void checkWrite(String filename) {
+               throw new SecurityException("Cannot write files via file names.");
+       }
+
+       /** Check if the current thread is allowed to delete the
+        ** given file.<P>
+        **
+        ** This method is called from File.delete().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param filename the full name of the file to delete
+        ** @exception SecurityException if th operation is not
+        **            permitted.
+        ** @see java.io.File#delete()
+        **/
+       public void checkDelete(String filename) {
+               throw new SecurityException("Cannot delete files.");
+       }
+
+       /** Check if the current thread is allowed to connect to a
+        ** given host on a given port.<P>
+        **
+        ** This method is called from Socket.Socket().
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param host the host to connect to
+        ** @param port the port to connect on
+        ** @exception SecurityException if the operation is not
+        **            permitted
+        ** @see java.net.Socket#Socket()
+        **/
+       public void checkConnect(String host, int port) {
+               throw new SecurityException("Cannot make network connections.");
+       }
+
+       /** Check if the current thread is allowed to connect to a
+        ** given host on a given port using a specific security
+        ** context to determine access.<P>
+        **
+        ** This method is not called in the 1.1 core classes.<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param host the host to connect to
+        ** @param port the port to connect on
+        ** @param securityContext the security context to
+        **        determine access with
+        ** @exception SecurityException if the operation is not
+        **            permitted
+        **/
+       public void checkConnect(String host, int port, Object securityContext) {
+               throw new SecurityException("Cannot make network connections.");
+       }
+
+       /** Check if the current thread is allowed to listen to a
+        ** specific port for data.<P>
+        **
+        ** This method is called by ServerSocket.ServerSocket().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param port the port to listen on
+        ** @exception SecurityException if the operation is not
+        **            permitted
+        ** @see java.net.ServerSocket#ServerSocket(int)
+        **/
+       public void checkListen(int port) {
+               throw new SecurityException("Cannot listen for connections.");
+       }
+
+       /** Check if the current thread is allowed to accept a
+        ** connection from a particular host on a particular
+        ** port.<P>
+        **
+        ** This method is called by ServerSocket.implAccept().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param host the host which wishes to connect
+        ** @param port the port the connection will be on
+        ** @exception SecurityException if the operation is not
+        **            permitted
+        ** @see java.net.ServerSocket#accept()
+        **/
+       public void checkAccept(String host, int port) {
+               throw new SecurityException("Cannot accept connections.");
+       }
+
+       /** Check if the current thread is allowed to read and
+        ** write multicast to a particular address.<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @XXX where is it called?
+        **
+        ** @param addr the address to multicast to.
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        **/
+       public void checkMulticast(InetAddress addr) {
+               throw new SecurityException("Cannot read or write multicast.");
+       }
+
+       /** Check if the current thread is allowed to read and
+        ** write multicast to a particular address with a
+        ** particular ttl value.<P>
+        **
+        ** SecurityManager's implementation always denies access.<P>
+        **
+        ** @XXX where is it called?
+        **
+        ** @XXX what the hell is ttl?  Expand abbreviation.
+        **
+        ** @param addr the address to multicast to.
+        ** @param ttl the ttl value to use
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        **/
+       public void checkMulticast(InetAddress addr, byte ttl) {
+               throw new SecurityException("Cannot read or write multicast.");
+       }
+
+        /**
+         ** Check if the current thread is allowed to perform an
+         ** operation that requires the specified <code>Permission</code>.
+         **
+         ** @param perm The <code>Permission</code> required.
+         ** @exception SecurityException If the operation is not allowed.
+         **/
+         public void checkPermission(java.security.Permission perm) {
+               throw new SecurityException("Operation not allowed");
+       }
+
+        /**
+         ** Check if the current thread is allowed to perform an
+         ** operation that requires the specified <code>Permission</code>.
+         **
+         ** @param perm The <code>Permission</code> required.
+        ** @param context A security context
+         ** @exception SecurityException If the operation is not allowed.
+        ** @since 1.2
+         **/
+         public void checkPermission(java.security.Permission perm,
+                                    Object context) {
+               throw new SecurityException("Operation not allowed");
+       }
+
+       /** Check if the current thread is allowed to read or
+        ** write all the system properties at once.<P>
+        **
+        ** This method is called by System.getProperties()
+        ** and setProperties().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.lang.System#getProperties()
+        ** @see java.lang.System#setProperties(java.util.Properties)
+        **/
+       public void checkPropertiesAccess() {
+               throw new SecurityException("Cannot access all system properties at once.");
+       }
+
+       /** Check if the current thread is allowed to read or
+        ** write a particular system property.<P>
+        **
+        ** This method is called by System.getProperty() and
+        ** setProperty().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @exception SecurityException is the operation is not
+        **            permitted.
+        ** @see java.lang.System#getProperty(java.lang.String)
+        ** @see java.lang.System#setProperty(java.lang.String,java.lang.String)
+        **/
+       public void checkPropertyAccess(String name) {
+               throw new SecurityException("Cannot access individual system properties.");
+       }
+
+       /** Check if the current thread is allowed to create a
+        ** top-level window.  If it is not, the operation should
+        ** still go through, but some sort of nonremovable
+        ** warning should be placed on the window to show that it
+        ** is untrusted.<P>
+        **
+        ** This method is called by Window.Window().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param window the window to create
+        ** @see java.awt.Window#Window(java.awt.Frame)
+        **/
+       public boolean checkTopLevelWindow(Object window) {
+         return false;
+       }
+
+       /** Check if the current thread is allowed to create a
+        ** print job.<P>
+        **
+        ** This method is called by Toolkit.getPrintJob().  (I
+        ** assume so, at least, it just don't say nothing about
+        ** it in the spec.)<P>
+        ** 
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.awt.Toolkit.getPrintJob(java.awt.Frame,java.lang.String,java.util.Properties)
+        **/
+       public void checkPrintJobAccess() {
+               throw new SecurityException("Cannot create print jobs.");
+       }
+
+       /** Check if the current thread is allowed to use the
+        ** system clipboard.<P>
+        **
+        ** This method is called by Toolkit.getSystemClipboard().
+        ** (I assume.)<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.awt.Toolkit#getSystemClipboard()
+        **/
+       public void checkSystemClipboardAccess() {
+               throw new SecurityException("Cannot access the system clipboard.");
+       }
+
+       /** Check if the current thread is allowed to use the AWT
+        ** event queue.<P>
+        **
+        ** This method is called by Toolkit.getSystemEventQueue().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.awt.Toolkit#getSystemEventQueue()
+        **/
+       public void checkAwtEventQueueAccess() {
+               throw new SecurityException("Cannot access the AWT event queue.");
+       }
+
+       /** Check if the current thread is allowed to access the
+        ** specified package at all.<P>
+        **
+        ** This method is called by ClassLoader.loadClass() in
+        ** user-created ClassLoaders.<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param packageName the package name to check access to
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.lang.ClassLoader#loadClass(java.lang.String,boolean)
+        **/
+       public void checkPackageAccess(String packageName) {
+               throw new SecurityException("Cannot access packages via the ClassLoader.");
+       }
+
+       /** Check if the current thread is allowed to define
+        ** classes the specified package.  If the class already
+        ** created, though, ClassLoader.loadClass() can still
+        ** return the Class if checkPackageAccess() checks out.<P>
+        **
+        ** This method is called by ClassLoader.loadClass() in
+        ** user-created ClassLoaders.<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param packageName the package name to check access to
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.lang.ClassLoader#loadClass(java.lang.String,boolean)
+        **/
+       public void checkPackageDefinition(String packageName) {
+               throw new SecurityException("Cannot load classes into any packages via the ClassLoader.");
+       }
+
+       /** Check if the current thread is allowed to set the
+        ** current socket factory.<P>
+        **
+        ** This method is called by Socket.setSocketImplFactory(),
+        ** ServerSocket.setSocketFactory(), and
+        ** URL.setURLStreamHandlerFactory().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.net.Socket#setSocketImplFactory(java.net.SocketImplFactory)
+        ** @see java.net.ServerSocket#setSocketFactory(java.net.SocketImplFactory)
+        ** @see java.net.URL#setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory)
+        **/
+       public void checkSetFactory() {
+               throw new SecurityException("Cannot set the socket factory.");
+       }
+
+       /** Check if the current thread is allowed to get certain
+        ** types of Methods, Fields and Constructors from a Class
+        ** object.<P>
+        **
+        ** This method is called by Class.getMethod[s](),
+        ** Class.getField[s](), Class.getConstructor[s],
+        ** Class.getDeclaredMethod[s](),
+        ** Class.getDeclaredField[s](), and
+        ** Class.getDeclaredConstructor[s]().<P>
+        **
+        ** SecurityManager's implementation always denies access.
+        **
+        ** @param c the Class to check
+        ** @param memberType the type of members to check
+        **        against, either Member.DECLARED or
+        **        Member.PUBLIC.
+        ** @exception SecurityException if the operation is not
+        **            permitted.
+        ** @see java.lang.Class
+        ** @see java.lang.reflect.Member#DECLARED
+        ** @see java.lang.reflect.Member#PUBLIC
+        **/
+       public void checkMemberAccess(Class c, int memberType) {
+               throw new SecurityException("Cannot access members of classes.");
+       }
+
+       /** Test whether a particular security action may be
+        ** taken.
+        ** @param action the desired action to take
+        ** @exception SecurityException if the action is denied.
+        ** @XXX I have no idea what actions must be tested
+        **      or where.
+        **/
+       public void checkSecurityAccess(String action) {
+               checkPermission (new java.security.SecurityPermission (action));
+       }
+
+       /** Get the ThreadGroup that a new Thread should belong
+        ** to by default.<P>
+        **
+        ** Called by Thread.Thread().<P>
+        **
+        ** SecurityManager's implementation just uses the
+        ** ThreadGroup of the current Thread.<P>
+        **
+        ** <STRONG>Spec Note:</STRONG> it is not clear whether
+        ** the new Thread is guaranteed to pass the
+        ** checkAccessThreadGroup() test when using this
+        ** ThreadGroup.  I presume so.
+        **
+        ** @return the ThreadGroup to put the new Thread into.
+        **/
+       public ThreadGroup getThreadGroup() {
+               return Thread.currentThread().getThreadGroup();
+       }
+
+       protected SecurityManager () {
+               if (System.getSecurityManager () != null)
+                       throw new SecurityException ();
+       }
+}
+
+class SecurityContext {
+       Class[] classes;
+       SecurityContext(Class[] classes) {
+               this.classes = classes;
+       }
 }