/*
 * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

 // classes in lib get all permissions by default
 grant codeBase "file:${com.sun.aas.installRoot}/lib/-" {
     permission java.security.AllPermission;
 };

 // Core server classes get all permissions by default
 grant codeBase "file:${com.sun.aas.installRoot}/modules/-" {
     permission java.security.AllPermission;
 };

 // Felix classes get all permissions by default
 grant codeBase "file:${com.sun.aas.installRoot}/osgi/felix/bin/-" {
     permission java.security.AllPermission;
 };

 // iMQ classes get all permissions by default
 grant codeBase "file:${com.sun.aas.imqLib}/-" {
     permission java.security.AllPermission;
 };

 // Derby driver classes get all permissions by default
 grant codeBase "file:${com.sun.aas.derbyRoot}/lib/-" {
     permission java.lang.RuntimePermission "createClassLoader";
     permission java.io.FilePermission       "<<ALL FILES>>", "read,write";
     permission java.security.AllPermission;
 };


 // permission for JDK's tools.jar to enable webservice annotation processing
 // at runtime by wsgen tool:
 //       permission java.lang.RuntimePermission "createClassLoader";
 //
 // permission for JDK's tools.jar to sign JARs at runtime for
 // Java Web Start support:
 //       permissions java.security.AllPermission;
 // on the advice of the JDK tools folks.  Should be refined later.
 //Bug Glassfish-21012 - changing to the right location of tools.jar
 grant codeBase "file:${com.sun.aas.javaRoot}/../lib/tools.jar" {
     permission java.security.AllPermission;
 };

 //Loading MBeans from anywhere, to take care of side effects of 6235678.
 grant {
     permission javax.management.MBeanTrustPermission "register" ;
 };
 //Loading MBeans from anywhere, to take care of side effects of 6235678.


 // Basic set of required permissions granted to all remaining code
 // The permission FilePermission "<<ALL FILES>>", "read,write"
 // allows all applications to read and write any file in the filesystem.
 // It should be changed based on real deployment needs. If you know your
 // applications just need to read/write a few directories consider removing
 // this permission and adding grants indicating those specific directories.
 // against the codebase of your application(s).
 grant {
     //Workaround for bugs #6484935, 6513799
     permission java.lang.RuntimePermission "getProtectionDomain";
     permission com.sun.corba.ee.impl.presentation.rmi.DynamicAccessPermission "access";
     permission java.util.PropertyPermission "*", "read,write";

     permission java.lang.RuntimePermission  "loadLibrary.*";
     permission java.lang.RuntimePermission  "queuePrintJob";
     permission java.net.SocketPermission    "*", "connect,resolve";

         // work-around for pointbase bug 4864405
         permission java.io.FilePermission "${com.sun.aas.instanceRoot}${/}lib${/}databases${/}-", "delete";
         permission java.io.FilePermission "${java.io.tmpdir}${/}-", "delete";

     permission java.util.PropertyPermission "*", "read";

     permission java.lang.RuntimePermission    "modifyThreadGroup";
     permission java.lang.RuntimePermission    "getClassLoader";
     permission java.lang.RuntimePermission    "setContextClassLoader";
     permission javax.management.MBeanPermission "[com.sun.messaging.jms.*:*]", "*";

     // Following needed for CTS to pass with SM on, bug 16344201
     permission java.lang.RuntimePermission "closeClassLoader";
     permission java.io.SerializablePermission "enableSubstitution";
     permission java.security.SecurityPermission "getProperty.package.definition";
 };

 // Following grant block is only required by Connectors. If Connectors
 // are not in use the recommendation is to remove this grant.
 grant {
         permission javax.security.auth.PrivateCredentialPermission "jakarta.resource.spi.security.PasswordCredential * \"*\"","read";
 };

 // Following grant block is only required for Reflection. If Reflection
 // is not in use the recommendation is to remove this section.
 grant {
     permission java.lang.RuntimePermission "accessDeclaredMembers";
 };

 // Permissions to invoke CORBA objects in server
 grant {
     permission com.sun.enterprise.security.CORBAObjectPermission "*", "*";
 };
     // GLASSFISH-21011
 grant {
     permission java.io.SerializablePermission "enableSubclassImplementation";
 };

 grant  codeBase "file:${com.sun.aas.instanceRoot}/applications/-"{
     permission java.io.FilePermission       "<<ALL FILES>>", "read,write";
     permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers";
 };
 //Added for changes proposed by Derby 10.12.1.1 (DERBY-6648) and Derby 10.14.2.0
 grant {
      permission org.apache.derby.security.SystemPermission "engine", "usederbyinternals";

      permission java.net.SocketPermission "*", "listen";
      permission java.net.SocketPermission "*", "accept";
      permission java.io.FilePermission       "<<ALL FILES>>", "write,read";

      // Added for Derby 10.15.1.3 and above
      permission org.apache.derby.shared.common.security.SystemPermission "engine", "usederbyinternals";

 };
//Added for creating stub on JDK 11
grant codeBase "jrt:/jdk.compiler" {
      permission java.lang.RuntimePermission "getenv.JDK_JAVAC_OPTIONS";
      permission java.lang.RuntimePermission "createClassLoader";
};

// Following grant block is required for using JDK JarSigner
grant {
    permission java.lang.RuntimePermission "accessClassInPackage.jdk.internal.misc";
};