com.sun.enterprise.security.perms.SMGlobalPolicyUtil Maven / Gradle / Ivy
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package com.sun.enterprise.security.perms;
import java.net.URL;
import java.security.CodeSource;
import java.security.Permission;
import java.security.AllPermission;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.cert.Certificate;
import java.util.Enumeration;
import java.util.Map;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import com.sun.logging.LogDomains;
import sun.security.provider.PolicyFile;
/**
*
* Utility class to load the EE permissions, EE restrictions,
* and check restrictions for a given permission set
*
*/
public class SMGlobalPolicyUtil {
static Logger logger = Logger.getLogger(LogDomains.SECURITY_LOGGER);
/**
*
* Java EE Component type supporting the use of declared permissions
*
*/
public enum CommponentType {
ear,
ejb,
war,
rar,
car
}
private enum PolicyType {
/**
* Configured EE permissions in the domain
*/
EEGranted,
/**
* Configured EE restriction list in the domain
*/
EERestricted,
/**
* Configured domain allowed list
*/
ServerAllowed
}
/**
* This is the file storing the default permissions granted to each component type
*/
public static final String EE_GRANT_FILE = "javaee.server.policy";
/**
* This is the file storing the restricted permissions for each component type;
* Any permissions declared in this list can not be used by the application
*/
public static final String EE_RESTRICTED_FILE = "restrict.server.policy";
/**
* This is the file storing the allowed permissions for each component type
* A permission listed in this file may not be used but the application,
* but any application declared permission must exist in this list;
*/
public static final String SERVER_ALLOWED_FILE = "restrict.server.policy";
protected static final String SYS_PROP_JAVA_SEC_POLICY = "java.security.policy";
/**
* Code source URL representing Ejb type
*/
public static final String EJB_TYPE_CODESOURCE = "file:/module/Ejb";
/**
* Code source URL representing Web type
*/
public static final String WEB_TYPE_CODESOURCE = "file:/module/Web";
/**
* Code source URL representing Rar type
*/
public static final String RAR_TYPE_CODESOURCE = "file:/module/Rar";
/**
* Code source URL representing App client type
*/
public static final String CLIENT_TYPE_CODESOURCE = "file:/module/Car";
/**
* Code source URL representing Ear type
*/
public static final String EAR_TYPE_CODESOURCE = "file:/module/Ear";
public static final String EAR_CLASS_LOADER = "org.glassfish.javaee.full.deployment.EarClassLoader";
//map recording the 'Java EE component type' to its code source URL
private static final Map CompTypeToCodeBaseMap = new HashMap();
static {
CompTypeToCodeBaseMap.put(CommponentType.ejb, EJB_TYPE_CODESOURCE);
CompTypeToCodeBaseMap.put(CommponentType.war, WEB_TYPE_CODESOURCE);
CompTypeToCodeBaseMap.put(CommponentType.rar, RAR_TYPE_CODESOURCE);
CompTypeToCodeBaseMap.put(CommponentType.car, CLIENT_TYPE_CODESOURCE);
CompTypeToCodeBaseMap.put(CommponentType.ear, EAR_TYPE_CODESOURCE);
}
//map recording the 'Java EE component type' to its EE granted permissions
private static final Map compTypeToEEGarntsMap
= new HashMap();
//map recording the 'Java EE component type' to its EE restricted permissions
private static final Map compTypeToEERestrictedMap
= new HashMap();
//map recording the 'Java EE component type' to its allowed permissions
private static final Map compTypeToServAllowedMap
= new HashMap();
private static boolean eeGrantedPolicyInitDone = false;
protected static final String domainCfgFolder = getJavaPolicyFolder() + File.separator;
private static final AllPermission ALL_PERM = new AllPermission();
//convert a string type to the CommponentType
public static CommponentType convertComponentType(String type) {
return Enum.valueOf(CommponentType.class, type);
}
/**
* Get the default granted permissions of a specified component type
* @param type Java EE component type
* @return the permission set granted to the specified component
*/
public static PermissionCollection getEECompGrantededPerms(CommponentType type) {
initDefPolicy();
return compTypeToEEGarntsMap.get(type);
}
/**
* Get the default granted permissions of a specified component type
* @param type Java EE component type such as ejb, war, rar, car, ear
* @return
*/
public static PermissionCollection getEECompGrantededPerms(String type) {
CommponentType compType = convertComponentType(type);
return getEECompGrantededPerms(compType);
}
/**
* Get the restricted permission set of a specified component type on the server
* @param type Java EE component type
* @return the restricted permission set of the specified component type on the server
*/
public static PermissionCollection getCompRestrictedPerms(CommponentType type) {
initDefPolicy();
return compTypeToEERestrictedMap.get(type);
}
public static PermissionCollection getCompRestrictedPerms(String type) {
CommponentType compType = convertComponentType(type);
return getCompRestrictedPerms(compType);
}
private synchronized static void initDefPolicy() {
try {
if (logger.isLoggable(Level.FINE)){
logger.fine("defGrantedPolicyInitDone= " + eeGrantedPolicyInitDone);
}
if (eeGrantedPolicyInitDone)
return;
eeGrantedPolicyInitDone = true;
loadServerPolicy(PolicyType.EEGranted);
loadServerPolicy(PolicyType.EERestricted);
loadServerPolicy(PolicyType.ServerAllowed);
checkDomainRestrictionsForDefaultPermissions();
} catch (FileNotFoundException e) {
//ignore: the permissions files not exist
} catch (IOException e) {
logger.warning(e.getMessage());
throw new RuntimeException(e);
}
}
private static String getJavaPolicyFolder() {
String policyPath = System.getProperty(SYS_PROP_JAVA_SEC_POLICY);
if (policyPath == null)
return null;
File pf = new File(policyPath);
return pf.getParent();
}
private static void loadServerPolicy(PolicyType policyType) throws IOException {
if (policyType == null)
return;
if (logger.isLoggable(Level.FINE)){
logger.fine("PolicyType= " + policyType);
}
String policyFilename = null;
Map policyMap = null;
switch (policyType) {
case EEGranted:
policyFilename = domainCfgFolder + EE_GRANT_FILE;
policyMap = compTypeToEEGarntsMap;
break;
case EERestricted:
policyFilename = domainCfgFolder + EE_RESTRICTED_FILE;
policyMap = compTypeToEERestrictedMap;
break;
case ServerAllowed:
policyFilename = domainCfgFolder + SERVER_ALLOWED_FILE;
policyMap = compTypeToServAllowedMap;
break;
}
if (policyFilename == null || policyMap == null)
throw new IllegalArgumentException("Unrecognized policy type: " + policyType);
if (logger.isLoggable(Level.FINE)){
logger.fine("policyFilename= " + policyFilename);
}
File f = new File(policyFilename);
if (!f.exists())
return;
URL furl = new URL("file:" + policyFilename);
if (logger.isLoggable(Level.FINE)){
logger.fine("Loading policy from " + furl);
}
PolicyFile pf = new PolicyFile(furl);
CodeSource cs = new CodeSource(new URL(EJB_TYPE_CODESOURCE), (Certificate[])null );
PermissionCollection pc = pf.getPermissions(cs);
policyMap.put(CommponentType.ejb, pc);
if (logger.isLoggable(Level.FINE)){
logger.fine("Loaded EJB policy = " + pc);
}
cs = new CodeSource(new URL(WEB_TYPE_CODESOURCE), (Certificate[])null );
pc = pf.getPermissions(cs);
policyMap.put(CommponentType.war, pc);
if (logger.isLoggable(Level.FINE)){
logger.fine("Loaded WEB policy =" + pc);
}
cs = new CodeSource(new URL(RAR_TYPE_CODESOURCE), (Certificate[])null );
pc = pf.getPermissions(cs);
policyMap.put(CommponentType.rar, pc);
if (logger.isLoggable(Level.FINE)){
logger.fine("Loaded rar policy =" + pc);
}
cs = new CodeSource(new URL(CLIENT_TYPE_CODESOURCE), (Certificate[])null );
pc = pf.getPermissions(cs);
policyMap.put(CommponentType.car, pc);
if (logger.isLoggable(Level.FINE)){
logger.fine("Loaded car policy =" + pc);
}
cs = new CodeSource(new URL(EAR_TYPE_CODESOURCE), (Certificate[])null );
pc = pf.getPermissions(cs);
policyMap.put(CommponentType.ear, pc);
if (logger.isLoggable(Level.FINE)){
logger.fine("Loaded ear policy =" + pc);
}
}
//this checks default permissions against restrictions
private static void checkDomainRestrictionsForDefaultPermissions() throws SecurityException {
checkEETypePermsAgainstServerRestiction(CommponentType.ejb);
checkEETypePermsAgainstServerRestiction(CommponentType.war);
checkEETypePermsAgainstServerRestiction(CommponentType.rar);
checkEETypePermsAgainstServerRestiction(CommponentType.car);
checkEETypePermsAgainstServerRestiction(CommponentType.ear);
}
private static void checkEETypePermsAgainstServerRestiction(CommponentType type) throws SecurityException {
checkRestriction(compTypeToEEGarntsMap.get(type),
compTypeToEERestrictedMap.get(type));
}
public static void checkRestriction (CommponentType type,
PermissionCollection declaredPC ) throws SecurityException {
checkRestriction(declaredPC, getCompRestrictedPerms(type));
}
/**
* Checks a permissions set against a restriction set
* @param declaredPC
* @param restrictedPC
* @return true for passed
* @throws SecurityException is thrown if violation detected
*/
public static void checkRestriction (PermissionCollection declaredPC,
PermissionCollection restrictedPC) throws SecurityException {
if (restrictedPC == null || declaredPC == null)
return;
//check declared does not contain restricted
checkContains(declaredPC, restrictedPC);
//check restricted does not contain declared
checkContains(restrictedPC, declaredPC);
}
//check if permissionCollection toBeCheckedPC is contained/implied by containPC
private static void checkContains(PermissionCollection containPC,
PermissionCollection toBeCheckedPC) throws SecurityException {
if (containPC == null || toBeCheckedPC == null)
return;
Enumeration checkEnum = toBeCheckedPC.elements();
while (checkEnum.hasMoreElements()) {
Permission p = checkEnum.nextElement();
if (containPC.implies(p)) {
throw new SecurityException("Restricted permission " + p
+ " is declared or implied in the " + containPC);
}
}
return;
}
/**
* Check a permission set against a restriction of a component type
* @param declaredPC
* @param type
* @return
* @throws SecurityException
*/
public static void checkRestrictionOfComponentType (PermissionCollection declaredPC, CommponentType type) throws SecurityException {
if (CommponentType.ear == type)
checkRestrictionOfEar(declaredPC);
PermissionCollection restrictedPC =
compTypeToEERestrictedMap.get(type);
checkRestriction(declaredPC, restrictedPC);
}
//for ear type, check evrything
public static void checkRestrictionOfEar (PermissionCollection declaredPC) throws SecurityException {
PermissionCollection pc =
compTypeToEERestrictedMap.get(CommponentType.ejb);
if (pc != null)
SMGlobalPolicyUtil.checkRestriction(declaredPC, pc);
pc = compTypeToEERestrictedMap.get(CommponentType.war);
if (pc != null)
SMGlobalPolicyUtil.checkRestriction(declaredPC, pc);
pc = compTypeToEERestrictedMap.get(CommponentType.rar);
if (pc != null)
SMGlobalPolicyUtil.checkRestriction(declaredPC, pc);
pc = compTypeToEERestrictedMap.get(CommponentType.car);
if (pc != null)
SMGlobalPolicyUtil.checkRestriction(declaredPC, pc);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy