⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 permissions.java

📁 Use the links below to download a source distribution of Ant from one of our mirrors. It is good pra
💻 JAVA
字号:
/* *  Licensed to the Apache Software Foundation (ASF) under one or more *  contributor license agreements.  See the NOTICE file distributed with *  this work for additional information regarding copyright ownership. *  The ASF licenses this file to You under the Apache License, Version 2.0 *  (the "License"); you may not use this file except in compliance with *  the License.  You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * *  Unless required by applicable law or agreed to in writing, software *  distributed under the License is distributed on an "AS IS" BASIS, *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *  See the License for the specific language governing permissions and *  limitations under the License. * */package org.apache.tools.ant.types;import java.lang.reflect.Constructor;import java.security.UnresolvedPermission;import java.util.HashSet;import java.util.Iterator;import java.util.LinkedList;import java.util.List;import java.util.Set;import java.util.StringTokenizer;import org.apache.tools.ant.BuildException;import org.apache.tools.ant.ExitException;/** * This class implements a security manager meant for usage by tasks that run inside the * Ant VM. An examples are the Java Task and JUnitTask. * * The basic functionality is that nothing (except for a base set of permissions) is allowed, unless * the permission is granted either explicitly or implicitly. * If a permission is granted this can be overruled by explicitly revoking the permission. * * It is not permissible to add permissions (either granted or revoked) while the Security Manager * is active (after calling setSecurityManager() but before calling restoreSecurityManager()). * * @since Ant 1.6 */public class Permissions {    private List grantedPermissions = new LinkedList();    private List revokedPermissions = new LinkedList();    private java.security.Permissions granted = null;    private SecurityManager origSm = null;    private boolean active = false;    private boolean delegateToOldSM;    // Mandatory constructor for permission object.    private static final Class[] PARAMS = {String.class, String.class};    /**     * Create a set of Permissions.  Equivalent to calling     * <code>new Permissions(false)</code>.     */    public Permissions() {        this(false);    }    /**     * Create a set of permissions.     * @param delegateToOldSM  if <code>true</code> the old security manager     * will be used if the permission has not been explicitly granted or revoked     * in this instance.     */    public Permissions(boolean delegateToOldSM) {        this.delegateToOldSM = delegateToOldSM;    }    /**     * Adds a permission to be granted.     * @param perm The Permissions.Permission to be granted.     */    public void addConfiguredGrant(Permissions.Permission perm) {        grantedPermissions.add(perm);    }    /**     * Adds a permission to be revoked.     * @param perm The Permissions.Permission to be revoked     */    public void addConfiguredRevoke(Permissions.Permission perm) {        revokedPermissions.add(perm);    }    /**     * To be used by tasks wishing to use this security model before executing the part to be     * subject to these Permissions. Note that setting the SecurityManager too early may     * prevent your part from starting, as for instance changing classloaders may be prohibited.     * The classloader for the new situation is supposed to be present.     * @throws BuildException on error     */    public synchronized void setSecurityManager() throws BuildException {        origSm = System.getSecurityManager();        init();        System.setSecurityManager(new MySM());        active = true;    }    /**     * Initializes the list of granted permissions, checks the list of revoked permissions.     */    private void init() throws BuildException {        granted = new java.security.Permissions();        for (Iterator i = revokedPermissions.listIterator(); i.hasNext();) {            Permissions.Permission p = (Permissions.Permission) i.next();            if (p.getClassName() == null) {                throw new BuildException("Revoked permission " + p + " does not contain a class.");            }        }        for (Iterator i = grantedPermissions.listIterator(); i.hasNext();) {            Permissions.Permission p = (Permissions.Permission) i.next();            if (p.getClassName() == null) {                throw new BuildException("Granted permission " + p                        + " does not contain a class.");            } else {                java.security.Permission perm = createPermission(p);                granted.add(perm);            }        }        // Add base set of permissions        granted.add(new java.net.SocketPermission("localhost:1024-", "listen"));        granted.add(new java.util.PropertyPermission("java.version", "read"));        granted.add(new java.util.PropertyPermission("java.vendor", "read"));        granted.add(new java.util.PropertyPermission("java.vendor.url", "read"));        granted.add(new java.util.PropertyPermission("java.class.version", "read"));        granted.add(new java.util.PropertyPermission("os.name", "read"));        granted.add(new java.util.PropertyPermission("os.version", "read"));        granted.add(new java.util.PropertyPermission("os.arch", "read"));        granted.add(new java.util.PropertyPermission("file.encoding", "read"));        granted.add(new java.util.PropertyPermission("file.separator", "read"));        granted.add(new java.util.PropertyPermission("path.separator", "read"));        granted.add(new java.util.PropertyPermission("line.separator", "read"));        granted.add(new java.util.PropertyPermission("java.specification.version", "read"));        granted.add(new java.util.PropertyPermission("java.specification.vendor", "read"));        granted.add(new java.util.PropertyPermission("java.specification.name", "read"));        granted.add(new java.util.PropertyPermission("java.vm.specification.version", "read"));        granted.add(new java.util.PropertyPermission("java.vm.specification.vendor", "read"));        granted.add(new java.util.PropertyPermission("java.vm.specification.name", "read"));        granted.add(new java.util.PropertyPermission("java.vm.version", "read"));        granted.add(new java.util.PropertyPermission("java.vm.vendor", "read"));        granted.add(new java.util.PropertyPermission("java.vm.name", "read"));    }    private java.security.Permission createPermission(            Permissions.Permission permission) {        try {            // First add explicitly already resolved permissions will not be            // resolved when added as unresolved permission.            Class clazz = Class.forName(permission.getClassName());            String name = permission.getName();            String actions = permission.getActions();            Constructor ctr = clazz.getConstructor(PARAMS);            return (java.security.Permission) ctr.newInstance(new Object[] {                    name, actions });        } catch (Exception e) {            // Let the UnresolvedPermission handle it.            return new UnresolvedPermission(permission.getClassName(),                    permission.getName(), permission.getActions(), null);        }    }    /**     * To be used by tasks that just finished executing the parts subject to these permissions.     */    public synchronized void restoreSecurityManager() {        active = false;        System.setSecurityManager(origSm);    }    /**     * This inner class implements the actual SecurityManager that can be used by tasks     * supporting Permissions.     */    private class MySM extends SecurityManager {        /**         * Exit is treated in a special way in order to be able to return the exit code         * towards tasks.         * An ExitException is thrown instead of a simple SecurityException to indicate the exit         * code.         * Overridden from java.lang.SecurityManager         * @param status The exit status requested.         */        public void checkExit(int status) {            java.security.Permission perm = new java.lang.RuntimePermission("exitVM", null);            try {                checkPermission(perm);            } catch (SecurityException e) {                throw new ExitException(e.getMessage(), status);            }        }        /**         * The central point in checking permissions.         * Overridden from java.lang.SecurityManager         *         * @param perm The permission requested.         */        public void checkPermission(java.security.Permission perm) {            if (active) {                if (delegateToOldSM && !perm.getName().equals("exitVM")) {                    boolean permOK = false;                    if (granted.implies(perm)) {                        permOK = true;                    }                    checkRevoked(perm);                    /*                     if the permission was not explicitly granted or revoked                     the original security manager will do its work                    */                    if (!permOK && origSm != null) {                        origSm.checkPermission(perm);                    }                }  else {                    if (!granted.implies(perm)) {                        throw new SecurityException("Permission " + perm + " was not granted.");                    }                    checkRevoked(perm);                }            }        }        /**         * throws an exception if this permission is revoked         * @param perm the permission being checked         */        private void checkRevoked(java.security.Permission perm) {            for (Iterator i = revokedPermissions.listIterator(); i.hasNext();) {                if (((Permissions.Permission) i.next()).matches(perm)) {                    throw new SecurityException("Permission " + perm + " was revoked.");                }            }        }    }    /** Represents a permission. */    public static class Permission {        private String className;        private String name;        private String actionString;        private Set actions;        /**         * Set the class, mandatory.         * @param aClass The class name of the permission.         */        public void setClass(String aClass) {                className = aClass.trim();        }        /**         * Get the class of the permission.         * @return The class name of the permission.         */        public String getClassName() {            return className;        }        /**         * Set the name of the permission.         * @param aName The name of the permission.         */        public void setName(String aName) {            name = aName.trim();        }        /**         * Get the name of the permission.         * @return The name of the permission.         */        public String getName() {            return name;        }        /**         * Set the actions.         * @param actions The actions of the permission.         */        public void setActions(String actions) {            actionString = actions;            if (actions.length() > 0) {                this.actions = parseActions(actions);            }        }        /**         * Get the actions.         * @return The actions of the permission.         */        public String getActions() {            return actionString;        }        /**         * Learn whether the permission matches in case of a revoked permission.         * @param perm The permission to check against.         */        boolean matches(java.security.Permission perm) {            if (!className.equals(perm.getClass().getName())) {                return false;            }            if (name != null) {                if (name.endsWith("*")) {                    if (!perm.getName().startsWith(name.substring(0, name.length() - 1))) {                        return false;                    }                } else {                    if (!name.equals(perm.getName())) {                        return false;                    }                }            }            if (actions != null) {                Set as = parseActions(perm.getActions());                int size = as.size();                as.removeAll(actions);                if (as.size() == size) {                    // None of the actions revoked, so all allowed.                    return false;                }            }            return true;        }        /**         * Parses the actions into a set of separate strings.         * @param actions The actions to be parsed.         */        private Set parseActions(String actions) {            Set result = new HashSet();            StringTokenizer tk = new StringTokenizer(actions, ",");            while (tk.hasMoreTokens()) {                String item = tk.nextToken().trim();                if (!item.equals("")) {                    result.add(item);                }            }            return result;        }        /**         * Get a string description of the permissions.         * @return string description of the permissions.         */        public String toString() {            return ("Permission: " + className + " (\"" + name + "\", \"" + actions + "\")");        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -