// 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.

// Default Java 2 security policy required by OpenJPA.

// ================================================================
// The following permissions are needed to invoke the 'test' target in OpenJPA maven build.

grant CodeBase "file:///${user.home}/.m2/repository/org/apache/derby/derby/-" {

    permission java.io.FilePermission           "<<ALL FILES>>",    "read,write,delete";
    permission java.lang.RuntimePermission                          "createClassLoader";
    permission java.util.PropertyPermission     "derby.*",          "read";
};

grant CodeBase "file:///${test.basedir}/-" {

    permission java.io.FilePermission           "<<ALL FILES>>",    "read,write,delete";
    permission java.io.SerializablePermission                       "enableSubstitution";
    permission java.lang.RuntimePermission                          "accessDeclaredMembers";
    permission java.lang.RuntimePermission                          "createClassLoader";
    permission java.lang.RuntimePermission                          "getClassLoader";
    permission java.lang.RuntimePermission                          "setContextClassLoader";
    permission java.lang.RuntimePermission                          "setSecurityManager";
    permission java.lang.RuntimePermission                          "setIO";
    permission java.lang.reflect.ReflectPermission                  "suppressAccessChecks";
    permission java.util.PropertyPermission     "*",                "read,write";
};

grant CodeBase "file:///${user.home}/.m2/repository/-" {

    permission java.io.FilePermission           "<<ALL FILES>>",    "read,write";
    permission java.io.SerializablePermission                       "enableSubstitution";
    permission java.lang.RuntimePermission                          "accessDeclaredMembers";
    permission java.lang.RuntimePermission                          "createClassLoader";
    permission java.lang.RuntimePermission                          "getClassLoader";
    permission java.lang.RuntimePermission                          "setContextClassLoader";
    permission java.lang.RuntimePermission                          "setIO";
    permission java.lang.reflect.ReflectPermission                  "suppressAccessChecks";
    permission java.util.PropertyPermission     "*",                "read,write";
};

