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

package javax.security.jacc;

import java.lang.reflect.*;
import java.util.Enumeration;
import java.security.*; 
import javax.security.jacc.WebResourcePermission;
import javax.security.jacc.WebUserDataPermission;
import javax.security.jacc.WebRoleRefPermission;

import javax.security.jacc.HttpMethodSpec;
import javax.security.jacc.URLPattern;

import javax.servlet.http.HttpServletRequest;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.FileInputStream;
import java.io.ObjectOutputStream;
import java.io.FileOutputStream;

import com.sun.ejte.ccl.reporter.SimpleReporterAdapter;
 
public class TestWebPerms {
    private static SimpleReporterAdapter stat =
            new SimpleReporterAdapter("appserv-tests");
    private static String testSuite = "Sec::JACC API testWebPerms ";
    private static boolean isDebug = Boolean.getBoolean("debug");

    private static void debug(String msg) {
        if (isDebug) {
            System.out.println(msg);
        }
    }

    private static boolean testSerialization(Permission p1) {
        String description = "testSerialization:" + p1;
        boolean result = true;

        Permission p2 = p1;
        try {
            FileOutputStream fout = new 
                FileOutputStream("serial-test-file.tmp");
            ObjectOutputStream sout = new ObjectOutputStream(fout);
            sout.writeObject(p1);
            sout.flush();
            sout.close();
            fout.close();
        } catch( Throwable t ) { 
            t.printStackTrace();
            debug( "-- Serialization Test Failed(write)-" + p1.getName() + "," + p1.getActions())
;
        }

        try {
            FileInputStream fin = new FileInputStream("serial-test-file.tmp");
            ObjectInputStream sin = new ObjectInputStream(fin);
            p2 = (Permission) sin.readObject();
            sin.close();
            fin.close(); 
        } catch( Throwable t ) { 
            t.printStackTrace();
            debug( "-- Serialization Test Failed(read)-" + p1.getName() + "," + p1.getActions());
            result = false;
        }

        if (result == true) {
            if (p2.equals(p1)) { 
                debug( "-- Serialization Test Succeeded -----------" + p2.getName() + "," + p2.getActions());
            } else { 
                debug( "-- Serialization Test Failed-" + p1.getName() + "," + p1.getActions());
            }
        } else {
            debug( "-- Serialization Test Failed-" + p1.getName() + "," + p1.getActions());
        }

        return result;
    }

    private static void reportConstructResults(
            boolean result, boolean expectedToSucceed,Permission p) {
        if (result == expectedToSucceed) {
            if (expectedToSucceed) {
                debug( "-- Construct Test Succeeded -----------" + p.getName() + "," + p.getActions());
            } else {
                debug( "-- Construct Test Succeeded (negative)-" + p.getName() + "," + p.getActions());
            }
        } else {
            debug( "-- Construct Test Failed -------------");
        }
    }

    private static String makeWUDActions(String meth, String trans) {
        return meth == null ? (trans == null ? null : trans) :
            (trans == null ? meth : meth + trans);
    }

    private static boolean doWebResourcePermission( boolean expectedToSucceed,
                                             String name, String actions) {
        boolean result = true;

        WebResourcePermission p1,p2;

        p1 = null;
        try {
            debug( "-- Construct Test --" + expectedToSucceed + " " + name + " " + actions);

            p1 = new WebResourcePermission(name,actions);

            if (expectedToSucceed) {

                p2 = new WebResourcePermission(p1.getName(),p1.getActions()); 

                if (!p1.equals(p2)) {
                    result = false;
                    debug("p != p\n\t" + p1 + "\n\t" + p2);

                }

                if (!p1.implies(p2)) {
                    result = false;
                    debug("!p.implies(p)\n\t" + p1 + "\n\t" + p2);
                }

            } else {
                debug("unexpected success\t" + p1);
                result = false;
            }

        } catch( Throwable t ) { 

            if (expectedToSucceed) {
                t.printStackTrace();
            }

            result = false;
        }

        reportConstructResults(result,expectedToSucceed,p1);
        return result;
    }

    private static boolean doWebResourcePermission( boolean expectedToSucceed,
            String URLPattern, String[] methods) {
        boolean result = true;
        WebResourcePermission p1,p2;
        p1 = null;

        try {
            debug( "-- Construct Test --");
            p1 = new WebResourcePermission(URLPattern,methods);
            if (expectedToSucceed) {
                p2 = new WebResourcePermission(p1.getName(),p1.getActions()); 
                if (!p1.equals(p2)) {
                    result = false;
                    debug("p != p\n\t" + p1 + "\n\t" + p2);
                }
                if (!p1.implies(p2)) {
                    result = false;
                    debug("!p.implies(p)\n\t" + p1 + "\n\t" + p2);
                }
            } else {
                debug("unexpected success\t" + p1);
                result = false;
            }
        } catch( Throwable t ) { 
            if (expectedToSucceed) {
                t.printStackTrace();
            }
            result = false;
        }
        reportConstructResults(result,expectedToSucceed,p1);
        return result;
    }

    private static boolean doWebResourcePermission( boolean expectedToSucceed,
            HttpServletRequest request) {
        boolean result = true;

        WebResourcePermission p1,p2;

        p1 = null;

        try {
            debug( "-- Construct Test -----------------------------------------------");

            p1 = new WebResourcePermission(request);

            if (expectedToSucceed) {

                p2 = new WebResourcePermission(p1.getName(),p1.getActions()); 

                if (!p1.equals(p2)) {
                    result = false;
                    debug("p != p\n\t" + p1 + "\n\t" + p2);

                }

                if (!p1.implies(p2)) {
                    result = false;
                    debug("!p.implies(p)\n\t" + p1 + "\n\t" + p2);
                }

            } else {
                debug("unexpected success\t" + p1);
                result = false;
            }

        } catch( Throwable t ) { 

            if (expectedToSucceed) {
                t.printStackTrace();
            }

            result = false;
        }

        reportConstructResults(result,expectedToSucceed,p1);
        return result;
    }


    private static boolean doWebRoleRefPermission( boolean expectedToSucceed,
            String servletName, String roleRef) {
        boolean result = true;

        WebRoleRefPermission p1,p2;

        p1 = null;

        try {
            debug( "-- Construct Test -----------------------------------------------");

            p1 = new WebRoleRefPermission(servletName,roleRef);

            if (expectedToSucceed) {

                p2 = new WebRoleRefPermission(p1.getName(),p1.getActions()); 

                if (!p1.equals(p2)) {
                    result = false;
                    debug("p != p\n\t" + p1 + "\n\t" + p2);

                }

                if (!p1.implies(p2)) {
                    result = false;
                    debug("!p.implies(p)\n\t" + p1 + "\n\t" + p2);
                }

            } else {
                debug("unexpected success\t" + p1);
                result = false;
            }

        } catch( Throwable t ) { 

            if (expectedToSucceed) {
                t.printStackTrace();
            }

            result = false;
        }

        reportConstructResults(result,expectedToSucceed,p1);
        return result;
    }

    private static boolean doWebUserDataPermission( boolean expectedToSucceed,
                                             String name, String actions) {
        boolean result = true;

        WebUserDataPermission p1,p2;

        p1 = null;
        try {
            debug( "-- Construct Test --" + expectedToSucceed + " " + name + " " + actions);

            p1 = new WebUserDataPermission(name,actions);

            if (expectedToSucceed) {

                p2 = new WebUserDataPermission(p1.getName(),p1.getActions()); 

                if (!p1.equals(p2)) {
                    result = false;
                    debug("p != p\n\t" + p1 + "\n\t" + p2);

                }

                if (!p1.implies(p2)) {
                    result = false;
                    debug("!p.implies(p)\n\t" + p1 + "\n\t" + p2);
                }

            } else {
                debug("unexpected success\t" + p1);
                result = false;
            }

        } catch( Throwable t ) { 

            if (expectedToSucceed) {
                t.printStackTrace();
            }

            result = false;
        }

        reportConstructResults(result,expectedToSucceed,p1);
        return result;
    }

    private static boolean doWebUserDataPermission( boolean expectedToSucceed,
            String URLPattern, String methods, String transportType) {
        boolean result = true;
        WebUserDataPermission p1,p2;
        p1 = null;

        try {
            debug( "-- Construct Test --" + expectedToSucceed);
            p1 = new WebUserDataPermission
                (URLPattern,makeWUDActions(methods,transportType));

            if (expectedToSucceed) {
                p2 = new WebUserDataPermission(p1.getName(),p1.getActions()); 
                if (!p1.equals(p2)) {
                    result = false;
                    debug("p != p\n\t" + p1 + "\n\t" + p2);
                }
                if (!p1.implies(p2)) {
                    result = false;
                    debug("!p.implies(p)\n\t" + p1 + "\n\t" + p2);
                }
            } else {
                debug("unexpected success\t" + p1);
                result = false;
            }
        } catch( Throwable t ) { 
            if (expectedToSucceed) {
                t.printStackTrace();
            }
            result = false;
        }
        reportConstructResults(result,expectedToSucceed,p1);
        return result;
    }

    private static String printP(Permission p) {
        return p.getName() + "," + p.getActions();
    }

    private static boolean doPermissionImplies (boolean expectedResult,
            Permission thisP, Permission p) { 
        boolean result = true;
        String description = "doPermissionImplies:" +
            expectedResult + "-" + thisP + "-" + p;
        try {

            debug( "-- Permission implies Test ----------------------------------------------");

            if (thisP.implies(p) != expectedResult) {
                debug(
                    (expectedResult ? "unexpected failure:" :"unexpected success:")
                     + printP(p) + (expectedResult ?" not implied by:":" implied by:") + 
                     printP(thisP));
                debug( "-- Permission implies Test failed(not implied)----------------------------");
                result = false;
            } else {
                debug(printP(p) + 
                    (expectedResult ? " implied by:":" not implied by:") + 
                    printP(thisP));
                debug( "-- Permission implies Test Succeeded -------------------------------------");
                result = true;
            }
        } catch( Throwable t ) { 
            debug("unexpected exception");
            t.printStackTrace();
            debug( "-- Permission implies Test failed(exception)---------------------------------");
            result = false;
        }
        return result;
    }

    private static boolean doHttpMethodSpecImplies ( boolean expectedResult,
            HttpMethodSpec thisS, HttpMethodSpec thatS) {
        boolean result = true;
        String description = "doHttpMethodSpecImplies:" +
                expectedResult + "-" + thisS + "-" + thatS;
        try {

            debug( "-- HttpMethodSpec implies Test ----------------------------------------------");
            if (thisS.implies(thatS) != expectedResult) {
                debug(
                    (expectedResult ? "unexpected failure:" :"unexpected success:")
                     + thatS + (expectedResult ?" not implied by:":" implied by:") + thisS);
                debug( "-- HttpMethodSpec implies Test failed(not implied)----------------------------");
                result = false;
            } else {
                debug(thatS + 
                    (expectedResult ? " implied by:":" not implied by:") + thisS);
                result = true;
            }

            if (!thisS.implies(thisS)) {
                debug( "unexpected failure:" 
                    + thisS + " not implied by: " +  thisS);
                debug( "-- HttpMethodSpec implies Test failed(not implied)----------------------------");
                result = false;
            }

            if (!thatS.implies(thatS)) {
                debug( "unexpected failure:" 
                    + thatS + " not implied by: " + thatS);
                debug( "-- HttpMethodSpec implies Test failed(not implied)----------------------------");
                result = false;
            }
        } catch( Throwable t ) { 
            debug("unexpected exception");
            t.printStackTrace();
            debug( "-- HttpMethodSpec implies Test failed(exception)---------------------------------");
        }
        return result;
    }

    public static void main( String[] args ) {
        boolean result = true;

        String tArray[] = { 
            null, 
            ":NONE", 
            ":INTEGRAL", 
            ":CONFIDENTIAL" 
        };

        String mArray[] = {
          "GET",
          "HEAD",
          "OPTIONS",
          "POST",
          "PUT",
          "TRACE",
          "FLY",
          "DELETE"
        };

        String msArray[] = new String[(1<<mArray.length)];
        for (int i=0; i<msArray.length; i++) {
            if (i==0) msArray[i] = null;
            else {
                StringBuffer s = null;
                int bitValue = 1;
                for (int j=0; j<mArray.length; j++) {
                    if ((i & bitValue) == bitValue) {
                        if (s == null) s = new StringBuffer(mArray[j]);
                        else s.append("," + mArray[j]);
                    }
                    bitValue = bitValue * 2;
                }
                msArray[i] = s.toString();
            }
        }

        String pArray[] = {
            "/a/c",
            "/a/b/c.jsp",
            "/a/c/*",
            "/a/*",
            "/*",
            "*.jsp",
            "*.asp",
            "/"
        };

        String qpArray[] = {
            "/a/c",
            "/a/b/c.jsp",
            "/a/c/*:/a/c",
            "/a/*:/a/c:/a/b/c.jsp", 
            "/*:/a/c:/a/b/c.jsp:/a/c/*:/a/*",
            "*.jsp:/a/c/*:/a/*:/a/b/c.jsp",
            "*.asp:/a/c/*:/a/*",
            "/:/a/c:/a/b/c.jsp:/a/c/*:/a/*:*.jsp:*.asp"
        };
 
        for (int i=0; i<msArray.length; i++) {

            HttpMethodSpec s = HttpMethodSpec.getSpec(msArray[i]);

            int hCode = s.hashCode();

            String actions = s.getActions();

            debug("input actions: " + msArray[i] + 
                 " hashCode: " + hCode + 
                 " actions:" + actions);
        }

        HttpMethodSpec h1 = HttpMethodSpec.getSpec((String) null);
        HttpMethodSpec h2 = HttpMethodSpec.getSpec("!PUT,SWIM");
        HttpMethodSpec h3 = HttpMethodSpec.getSpec("PUT");
        HttpMethodSpec h4 = HttpMethodSpec.getSpec("SWIM");
        HttpMethodSpec h5 = HttpMethodSpec.getSpec("!PUT");

        result = result && doHttpMethodSpecImplies(true,h1,h1);
        result = result && doHttpMethodSpecImplies(true,h1,h2);
        result = result && doHttpMethodSpecImplies(true,h1,h3);
        result = result && doHttpMethodSpecImplies(true,h1,h4);
        result = result && doHttpMethodSpecImplies(true,h1,h5);

        result = result && doHttpMethodSpecImplies(false,h2,h1);
        result = result && doHttpMethodSpecImplies(true,h2,h2);
        result = result && doHttpMethodSpecImplies(false,h2,h3);
        result = result && doHttpMethodSpecImplies(false,h2,h4);
        result = result && doHttpMethodSpecImplies(false,h2,h5);

        result = result && doHttpMethodSpecImplies(false,h3,h1);
        result = result && doHttpMethodSpecImplies(false,h3,h2);
        result = result && doHttpMethodSpecImplies(true,h3,h3);
        result = result && doHttpMethodSpecImplies(false,h3,h4);
        result = result && doHttpMethodSpecImplies(false,h3,h5);

        result = result && doHttpMethodSpecImplies(false,h4,h1);
        result = result && doHttpMethodSpecImplies(false,h4,h2);
        result = result && doHttpMethodSpecImplies(false,h4,h3);
        result = result && doHttpMethodSpecImplies(true,h4,h4);
        result = result && doHttpMethodSpecImplies(false,h4,h5);

        result = result && doHttpMethodSpecImplies(false,h5,h1);
        result = result && doHttpMethodSpecImplies(true,h5,h2);
        result = result && doHttpMethodSpecImplies(false,h5,h3);
        result = result && doHttpMethodSpecImplies(true,h5,h4);
        result = result && doHttpMethodSpecImplies(true,h5,h5);

        for (int i=0; i<pArray.length; i++) {
            for (int j=0; j<msArray.length; j++) {

                result = result && doWebResourcePermission(true,pArray[i],msArray[j]);

                result = result && doPermissionImplies
                    (true,new WebResourcePermission(pArray[i],msArray[j]),
                     new WebResourcePermission(pArray[i],msArray[j]));

                result = result && doWebResourcePermission(true,qpArray[i],msArray[j]);

                result = result && doPermissionImplies
                    (true,new WebResourcePermission(qpArray[i],msArray[j]),
                     new WebResourcePermission(qpArray[i],msArray[j]));

                result = result && doPermissionImplies
                    (true,new WebResourcePermission(pArray[i],msArray[j]),
                     new WebResourcePermission(qpArray[i],msArray[j]));

                result = result && doPermissionImplies
                    (qpArray[i].equals(pArray[i]) ? true : false,
                     new WebResourcePermission(qpArray[i],msArray[j]),
                     new WebResourcePermission(pArray[i],msArray[j]));

                result = result && testSerialization
                    (new WebResourcePermission(pArray[i],msArray[j]));
                result = result && testSerialization
                    (new WebResourcePermission(qpArray[i],msArray[j]));

            }
        }

        result = result && doWebRoleRefPermission(true,"servletName","customer");

        WebRoleRefPermission a1,a2,a3,a4;
        a1 = new WebRoleRefPermission("servletName1","roleRef1");
        result = result && testSerialization(a1);
        a2 = new WebRoleRefPermission("servletName1","roleRef2");
        result = result && testSerialization(a2);
        a3 = new WebRoleRefPermission("servletName2","roleRef1");
        result = result && testSerialization(a3);
        a4 = new WebRoleRefPermission("servletName2","roleRef2");
        result = result && testSerialization(a4);

        result = result && doPermissionImplies(true,a1,a1);
        result = result && doPermissionImplies(false,a1,a2);
        result = result && doPermissionImplies(false,a1,a3);
        result = result && doPermissionImplies(false,a1,a4);
        result = result && doPermissionImplies(false,a2,a1);
        result = result && doPermissionImplies(true,a2,a2);
        result = result && doPermissionImplies(false,a2,a3);
        result = result && doPermissionImplies(true,a3,a3);
        result = result && doPermissionImplies(false,a3,a4);
        result = result && doPermissionImplies(false,a4,a1);
        result = result && doPermissionImplies(false,a4,a2);
        result = result && doPermissionImplies(false,a4,a3);
        result = result && doPermissionImplies(true,a4,a4);

        for (int i=0; i<pArray.length; i++) {
            for (int j=0; j<msArray.length; j++) {
                for (int k=0; k<tArray.length; k++) {
                    result = result && doWebUserDataPermission(true,pArray[i],msArray[j],tArray[k]);

                    result = result && doPermissionImplies
                        (true,
                         new WebUserDataPermission
                         (pArray[i],makeWUDActions(msArray[j],tArray[k])),
                         new WebUserDataPermission
                         (pArray[i],makeWUDActions(msArray[j],tArray[k])));

                    result = result && doWebUserDataPermission(true,qpArray[i],msArray[j],tArray[k]);

                    result = result && doPermissionImplies
                        (true,
                         new WebUserDataPermission
                         (qpArray[i],makeWUDActions(msArray[j],tArray[k])),
                         new WebUserDataPermission
                         (qpArray[i],makeWUDActions(msArray[j],tArray[k])));

                    result = result && doPermissionImplies
                        (true,
                         new WebUserDataPermission
                         (pArray[i],makeWUDActions(msArray[j],tArray[k])),
                         new WebUserDataPermission
                         (qpArray[i],makeWUDActions(msArray[j],tArray[k])));

                    result = result && doPermissionImplies
                        (qpArray[i].equals(pArray[i]) ? true : false,
                         new WebUserDataPermission
                         (qpArray[i],makeWUDActions(msArray[j],tArray[k])),
                         new WebUserDataPermission
                         (pArray[i],makeWUDActions(msArray[j],tArray[k])));

                    result = result && testSerialization
                        (new WebUserDataPermission
                         (pArray[i],makeWUDActions(msArray[j],tArray[k])));

                    result = result && testSerialization
                        (new WebUserDataPermission
                         (qpArray[i],makeWUDActions(msArray[j],tArray[k])));

                }
            }
        }

        stat.addStatus(testSuite, (result)? stat.PASS : stat.FAIL);
        stat.printSummary();
    }
}
