+++ /dev/null
-/* java.lang.SecurityManager
- Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-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.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-
-package java.lang;
-
-import java.net.*;
-import java.util.*;
-import java.io.*;
-
-/**
- ** 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;
- }
-
- /** 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();
- }
-
- /** 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());
- }
-
- /** 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();
- }
-
- public SecurityManager () {
- if (System.getSecurityManager () != null)
- throw new SecurityException ();
- }
-}
-
-class SecurityContext {
- Class[] classes;
- SecurityContext(Class[] classes) {
- this.classes = classes;
- }
-}