FileDocCategorySizeDatePackage
Policy.javaAPI DocAndroid 1.5 API9618Wed May 06 22:41:06 BST 2009java.security

Policy

public abstract class Policy extends Object
{@code Policy} is the common super type of classes which represent a system security policy. The {@code Policy} specifies which permissions apply to which code sources.

The system policy can be changed by setting the {@code 'policy.provider'} property in the file named {@code JAVA_HOME/lib/security/java.security} to the fully qualified class name of the desired {@code Policy}.

Only one instance of a {@code Policy} is active at any time.

since
Android 1.0

Fields Summary
private static final String
POLICY_PROVIDER
private static final SecurityPermission
SET_POLICY
private static final SecurityPermission
GET_POLICY
private static Policy
activePolicy
Constructors Summary
Methods Summary
static java.security.PolicygetAccessiblePolicy()
Shortcut accessor for friendly classes, to skip security checks. If active policy was set to null, loads default provider, so this method never returns null.
This method is synchronized with setPolicy()

        Policy current = activePolicy;
        if (current == null) {
            synchronized (Policy.class) {
                // double check in case value has been reassigned 
                // while we've been awaiting monitor
                if (activePolicy == null) {
                    activePolicy = getDefaultProvider();
                }
                return activePolicy;
            }
        }
        return current;
    
private static java.security.PolicygetDefaultProvider()

        final String defaultClass = (String) AccessController
                .doPrivileged(new PolicyUtils.SecurityPropertyAccessor(
                        POLICY_PROVIDER));
        if (defaultClass == null) {
            //TODO log warning
            //System.err.println("No policy provider specified. Loading the " 
            //           + DefaultPolicy.class.getName());
            return new DefaultPolicy();
        }

        // TODO accurate classloading
        return AccessController.doPrivileged(new PrivilegedAction<Policy>() {

            public Policy run() {
                try {
                    return (Policy) Class.forName(defaultClass, true,
                            ClassLoader.getSystemClassLoader()).newInstance();
                }
                catch (Exception e) {
                    //TODO log error 
                    //System.err.println("Error loading policy provider <" 
                    //                 + defaultClass + "> : " + e 
                    //                 + "\nSwitching to the default " 
                    //                 + DefaultPolicy.class.getName());
                    return new DefaultPolicy();
                }
            }
        });

    
public abstract java.security.PermissionCollectiongetPermissions(java.security.CodeSource cs)
Returns a {@code PermissionCollection} describing what permissions are allowed for the specified {@code CodeSource} based on the current security policy.

Note that this method is not called for classes which are in the system domain (i.e. system classes). System classes are always given full permissions (i.e. AllPermission). This can not be changed by installing a new policy.

param
cs the {@code CodeSource} to compute the permissions for.
return
the permissions that are granted to the specified {@code CodeSource}.
since
Android 1.0

public java.security.PermissionCollectiongetPermissions(java.security.ProtectionDomain domain)
Returns a {@code PermissionCollection} describing what permissions are allowed for the specified {@code ProtectionDomain} (more specifically, its {@code CodeSource}) based on the current security policy.

Note that this method is not< called for classes which are in the system domain (i.e. system classes). System classes are always given full permissions (i.e. AllPermission). This can not be changed by installing a new policy.

param
domain the {@code ProtectionDomain} to compute the permissions for.
return
the permissions that are granted to the specified {@code CodeSource}.
since
Android 1.0


                                                                                                                
        

                      
       

                                                                                                                     
        
        if (domain != null) {
            return getPermissions(domain.getCodeSource());
        }
        return new Permissions();
    
public static java.security.PolicygetPolicy()
Returns the current system security policy. If no policy has been instantiated then this is done using the security property {@code "policy.provider"}.

If a {@code SecurityManager} is installed, code calling this method needs the {@code SecurityPermission} {@code getPolicy} to be granted, otherwise a {@code SecurityException} will be thrown.

return
the current system security policy.
throws
SecurityException if a {@code SecurityManager} is installed and the caller does not have permission to invoke this method.
since
Android 1.0

        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            sm.checkPermission(GET_POLICY);
        }
        return getAccessiblePolicy();
    
public booleanimplies(java.security.ProtectionDomain domain, java.security.Permission permission)
Indicates whether the specified {@code Permission} is implied by the {@code PermissionCollection} of the specified {@code ProtectionDomain}.

param
domain the {@code ProtectionDomain} for which the permission should be granted.
param
permission the {@code Permission} for which authorization is to be verified.
return
{@code true} if the {@code Permission} is implied by the {@code ProtectionDomain}, {@code false} otherwise.
since
Android 1.0

        if (domain != null) {
            PermissionCollection total = getPermissions(domain);
            PermissionCollection inherent = domain.getPermissions();
            if (total == null) {
                total = inherent;
            } else if (inherent != null) {
                for (Enumeration en = inherent.elements(); en.hasMoreElements();) {
                    total.add((Permission)en.nextElement());
                }
            }
            if (total != null && total.implies(permission)) {
                return true;
            }
        }
        return false;
    
static booleanisSet()
Returns {@code true} if system policy provider is instantiated.

        return activePolicy != null;
    
public abstract voidrefresh()
Reloads the policy configuration for this {@code Policy} instance.

since
Android 1.0

public static voidsetPolicy(java.security.Policy policy)
Sets the system wide policy.

If a {@code SecurityManager} is installed, code calling this method needs the {@code SecurityPermission} {@code setPolicy} to be granted, otherwise a {@code SecurityException} will be thrown.

param
policy the {@code Policy} to set.
throws
SecurityException if a {@code SecurityManager} is installed and the caller does not have permission to invoke this method.
since
Android 1.0

        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            sm.checkPermission(SET_POLICY);
        }
        synchronized (Policy.class) {
            activePolicy = policy;
        }