<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">

<!--

   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.

-->
<!-- ========================================================================= -->
<!-- Checks that access to critical functions is not allowed.                  -->
<!--                                                                           -->
<!-- @author vincent.hardy@sun.com                                             -->
<!-- @version $Id$   -->
<!-- ========================================================================= -->

<svg xmlns="http://www.w3.org/2000/svg" 
     xmlns:xlink="http://www.w3.org/1999/xlink" 
     xmlns:test="http://xml.apache.org/batik/test"
     width="450" height="500" viewBox="0 0 450 500"
     onload="runTest()">

    <test:testResult id="testResult" result="failed"/>
    <script type="text/ecmascript"><![CDATA[
importPackage(Packages.java.awt);
importPackage(Packages.java.io);
importPackage(Packages.java.lang);
importPackage(Packages.java.lang.reflect);
importPackage(Packages.java.net);
importPackage(Packages.java.security);
importPackage(Packages.java.sql);
importPackage(Packages.java.util);
importPackage(Packages.javax.sound.sampled);

var svgNS = "http://www.w3.org/2000/svg";
var testNS = "http://xml.apache.org/batik/test";
var testedPath = "build.sh";
var testedHost = "nagoya.apache.org:8080";

var basePermissions = [
        ["AllPermission", new AllPermission()], 
        ["FilePermission read", new FilePermission(testedPath, "read")], 
        ["FilePermission write", new FilePermission(testedPath, "write")], 
        ["FilePermission execute", new FilePermission(testedPath, "execute")], 
        ["FilePermission delete", new FilePermission(testedPath, "delete")], 
        ["SocketPermission accept", new SocketPermission(testedHost, "accept")], 
        ["SocketPermission connect", new SocketPermission(testedHost, "connect")], 
        ["SocketPermission listen", new SocketPermission(testedHost, "listen")], 
        ["SocketPermission resolve", new SocketPermission(testedHost, "resolve")], 
        ["AudioPermission play", new AudioPermission("play")], 
        ["AudioPermission record", new AudioPermission("record")], 
        ["AWTPermission accessClipboard", new AWTPermission("accessClipboard")], 
        ["AWTPermission accessEventQueue", new AWTPermission("accessEventQueue")], 
        ["AWTPermission listenToAllAWTEvents", new AWTPermission("listenToAllAWTEvents")], 
        ["AWTPermission showWindowWithoutWarningBanner", new AWTPermission("showWindowWithoutWarningBanner")], 
        ["AWTPermission readDisplayPixels", new AWTPermission("readDisplayPixels")], 
        ["AWTPermission createRobot", new AWTPermission("createRobot")], 
        ["AWTPermission fullScreenExclusive", new AWTPermission("fullScreenExclusive")], 
        ["NetPermission setDefaultAuthenticator", new NetPermission("setDefaultAuthenticator")], 
        ["NetPermission requestPasswordAuthentication", new NetPermission("requestPasswordAuthentication")], 
        ["NetPermission specifyStreamHandler", new NetPermission("specifyStreamHandler")], 
        ["PropertyPermission java.home read", new PropertyPermission("java.home", "read")], 
        ["PropertyPermission java.home write", new PropertyPermission("java.home", "write")], 
        ["ReflectPermission", new ReflectPermission("suppressAccessChecks")], 
        ["RuntimePermission createClassLoader", new RuntimePermission("createClassLoader")], 
        ["RuntimePermission getClassLoader", new RuntimePermission("getClassLoader")], 
        ["RuntimePermission setContextClassLoader", new RuntimePermission("setContextClassLoader")], 
        ["RuntimePermission setSecurityManager", new RuntimePermission("setSecurityManager")], 
        ["RuntimePermission createSecurityManager", new RuntimePermission("createSecurityManager")], 
        ["RuntimePermission exitVM", new RuntimePermission("exitVM")], 
        ["RuntimePermission shutdownHooks", new RuntimePermission("shutdownHooks")], 
        ["RuntimePermission setFactory", new RuntimePermission("setFactory")], 
        ["RuntimePermission setIO", new RuntimePermission("setIO")], 
        ["RuntimePermission modifyThread", new RuntimePermission("modifyThread")], 
        ["RuntimePermission modifyThreadGroup", new RuntimePermission("modifyThreadGroup")], 
        ["RuntimePermission getProtectionDomain", new RuntimePermission("getProtectionDomain")], 
        ["RuntimePermission readFileDescriptor", new RuntimePermission("readFileDescriptor")], 
        ["RuntimePermission writeFileDescriptor", new RuntimePermission("writeFileDescriptor")], 
        ["RuntimePermission loadLibrary.{library name}", new RuntimePermission("loadLibrary.{library name}")], 
        ["RuntimePermission accessClassInPackage.java.security", new RuntimePermission("accessClassInPackage.java.security")], 
        ["RuntimePermission defineClassInPackage.java.lang", new RuntimePermission("defineClassInPackage.java.lang")], 
        ["RuntimePermission accessDeclaredMembers", new RuntimePermission("accessDeclaredMembers")], 
        ["RuntimePermission queuePrintJob", new RuntimePermission("queuePrintJob")], 
        ["SecurityPermission createAccessControlContext", new SerializablePermission("createAccessControlContext")], 
        ["SecurityPermission getDomainCombiner", new SerializablePermission("getDomainCombiner")], 
        ["SecurityPermission getPolicy", new SerializablePermission("getPolicy")], 
        ["SecurityPermission setPolicy", new SerializablePermission("setPolicy")], 
        ["SecurityPermission setSystemScope", new SerializablePermission("setSystemScope")], 
        ["SecurityPermission setIdentityPublicKey", new SerializablePermission("setIdentityPublicKey")], 
        ["SecurityPermission setIdentityInfo", new SerializablePermission("setIdentityInfo")], 
        ["SecurityPermission addIdentityCertificate", new SerializablePermission("addIdentityCertificate")], 
        ["SecurityPermission removeIdentityCertificate", new SerializablePermission("removeIdentityCertificate")], 
        ["SecurityPermission printIdentity", new SerializablePermission("printIdentity")], 
        ["SecurityPermission getSignerPrivateKey", new SerializablePermission("getSignerPrivateKey")], 
        ["SecurityPermission setSignerKeyPair", new SerializablePermission("setSignerKeyPair")], 
        ["SerializablePermission enableSubclassImplementation", new SerializablePermission("enableSubclassImplementation")],
        ["SerializablePermission enableSubstitution", new SerializablePermission("enableSubstitution")],
        ["SQLPermission", new SQLPermission("setLog")], 
    ];
    
var permissions = null;
var statusRects = null;
var nGranted = 0;
function init(){
    var docURL = document.getURLObject();
    if (docURL != null 
        && (docURL.getHost() != null)
        && !( "" == docURL.getHost())
        ) {
        permissions = new Array();

        var docHost = docURL.getHost();
        if (docURL.getPort() != -1) {
            docHost += ":" + docURL.getPort();
        }

        nGranted = 0;
        permissions[nGranted++] = ["SocketPermission accept " + docHost,
                          new SocketPermission(docHost, "accept")];
        permissions[nGranted++] = ["SocketPermission connect " + docHost,
                          new SocketPermission(docHost, "connect")];
        permissions[nGranted++] = ["SocketPermission resolve " + docHost,
                          new SocketPermission(docHost, "resolve")];
        permissions[nGranted++] = ["RuntimePermission stopThread", 
                                   new RuntimePermission("stopThread")];

        for (var i=0; i<basePermissions.length; i++){
            permissions[nGranted+i] = basePermissions[i];
        }
    } else {
        permissions = basePermissions;
    }
}

init();

function runTest(){
    var sm = System.getSecurityManager();
    var successCnt = 0;
    var unexpectedGrants = new Array();
    var unexpectedDenial = new Array();
    var unexpectedDenialCnt = 0;
    var unexpectedGrantsCnt = 0;

    if (sm == null){
        for (var i=0; i<nGranted; i++) {
            successCnt++;
        }
        for (var i=nGranted; i<permissions.length; i++) {
            unexpectedGrants[unexpectedGrantsCnt] = permissions[i][0];
            unexpectedGrantsCnt++;
        }
    }
    else {
        for (var i=0; i<nGranted; i++) {
            var p = permissions[i][1];
            var success = true;
            try {
                sm.checkPermission(p);
                successCnt++;
            } catch (se){
                unexpectedDenial[unexpectedDenialCnt] = permissions[i][0];
                unexpectedDenialCnt++;
            }
        }
        for (var i=nGranted; i<permissions.length; i++) {
            var p = permissions[i][1];
            var success = true;
            try {
                sm.checkPermission(p);
                unexpectedGrants[unexpectedGrantsCnt] = permissions[i][0];
                unexpectedGrantsCnt++;
            } catch (se){
                successCnt++;
            }
        }
    }

    // Update the test's metadata
    var result = document.getElementById("testResult");
    if ( successCnt == permissions.length ) {
        result.setAttributeNS(null, "result", "passed");
    } else {
        System.out.println("test failed: " + unexpectedGrantsCnt + " / " + unexpectedDenialCnt);
        result.setAttributeNS(null, "result", "failed");
        result.setAttributeNS(null, "errorCode", "unexpected.grants.or.denials");
        
        var unexpectedGrantsString = "";
        var unexpectedDenialString = "";

        for (var i=0; i<unexpectedGrantsCnt; i++) {
            unexpectedGrantsString += unexpectedGrants[i];
        }

        for (var i=0; i<unexpectedDenialCnt; i++) {
            unexpectedDenialString += unexpectedDenial[i];
        }

        System.out.println("unexpected.grants : " + unexpectedGrantsString);
        var entry = null;

        entry = document.createElementNS(testNS, "errorDescriptiongEntry");
        entry.setAttributeNS(null, "id", "unexpected.grants.count");
        entry.setAttributeNS(null, "value", "" + unexpectedGrantsCnt);
        result.appendChild(entry);

        entry = document.createElementNS(testNS, "errorDescriptionEntry");
        entry.setAttributeNS(null, "id", "unexpected.grants");
        entry.setAttributeNS(null, "value", unexpectedGrantsString);
        result.appendChild(entry);

        entry = document.createElementNS(testNS, "errorDescriptiongEntry");
        entry.setAttributeNS(null, "id", "unexpected.denials.count");
        entry.setAttributeNS(null, "value", "" + unexpectedDenialCnt);
        result.appendChild(entry);

        System.out.println("unexpected.denials : " + unexpectedDenialString);
        entry = document.createElementNS(testNS, "errorDescriptionEntry");
        entry.setAttributeNS(null, "id", "unexpected.denials");
        entry.setAttributeNS(null, "value", unexpectedDenialString);   
        result.appendChild(entry); 

   }
}

    ]]></script>

</svg>
