/*
 * Copyright (c) 2004, 2018 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
 */

grant codeBase "file:${com.sun.aas.installRoot}/domains/domain1/applications/j2ee-modules/web-programmatic-login-web/-" {
   permission com.sun.appserv.security.ProgrammaticLoginPermission
   "login";
};

// Core server classes 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;
};


// lockhart classes get all permissions by default
grant codeBase "file:${com.sun.aas.webconsoleLib}/cc.jar" {
        permission java.security.AllPermission;
};

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


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

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

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

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

// permissions for avkit classes
grant codeBase "file:${j2ee.appverification.home}/lib/-" {
    permission java.security.AllPermission;
};



// Basic set of required permissions granted to all remaining code
grant {
	permission java.lang.RuntimePermission  "loadLibrary.*";
	permission java.lang.RuntimePermission  "queuePrintJob";
	permission java.net.SocketPermission    "*", "connect";
	permission java.io.FilePermission       "<<ALL FILES>>", "read,write";

        // 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";
};


// 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 "*", "*";
};

