| /* | |
| * 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 jakarta.security.jacc; | |
| import java.lang.reflect.*; | |
| import java.util.Enumeration; | |
| import java.security.*; | |
| import jakarta.security.jacc.EJBMethodPermission; | |
| import jakarta.security.jacc.EJBRoleRefPermission; | |
| 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 TestEJBPerms { | |
| private static SimpleReporterAdapter stat = | |
| new SimpleReporterAdapter("appserv-tests"); | |
| private static String testSuite = "Sec::JACC API testEJBPerms "; | |
| private static boolean isDebug = Boolean.getBoolean("debug"); | |
| private static void debug(String msg) { | |
| if (isDebug) { | |
| System.out.println(msg); | |
| } | |
| } | |
| private static void testSerialization(Permission p1) { | |
| String description = "TestSerialization:" + p1.getName() + | |
| "," + p1.getActions(); | |
| 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()); | |
| stat.addStatus(description, stat.PASS); | |
| } else { | |
| debug( "-- Serialization Test Failed-" + p1.getName() + "," + p1.getActions()); | |
| stat.addStatus(description, stat.FAIL); | |
| } | |
| } else { | |
| debug( "-- Serialization Test Failed-" + p1.getName() + "," + p1.getActions()); | |
| stat.addStatus(description, stat.FAIL); | |
| } | |
| } | |
| private static void doEJBMethodPermission( boolean expectedToSucceed, | |
| String name, String actions) { | |
| String description = "doEJBMethodPermission:" + | |
| expectedToSucceed + "-" + name + "-" + actions; | |
| boolean result = true; | |
| EJBMethodPermission p1,p2; | |
| try { | |
| debug( "-- Construct Test --" + expectedToSucceed + | |
| " " + name + " " + actions); | |
| p1 = new EJBMethodPermission(name,actions); | |
| if (expectedToSucceed) { | |
| p2 = new EJBMethodPermission(p1.getName(),p1.getActions()); | |
| testSerialization(p2); | |
| 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; | |
| } | |
| if (result == expectedToSucceed) { | |
| if (expectedToSucceed) { | |
| debug( "-- Construct Test Succeeded -------------------------------------"); | |
| } else { | |
| debug( "-- Construct Test Succeeded (negative)---------------------------"); | |
| } | |
| stat.addStatus(description, stat.PASS); | |
| } else { | |
| debug( "-- Construct Test Failed ----------------------------------------"); | |
| stat.addStatus(description, stat.FAIL); | |
| } | |
| } | |
| private static void doEJBMethodPermission( boolean expectedToSucceed, | |
| String ejbName, String methodName, String methodInterface, | |
| String[] methodParams) { | |
| String description = "doEJBMethodPermissionWithParams:" + | |
| expectedToSucceed + "-" + ejbName + "-" + methodName + | |
| "-" + methodInterface + "-" + methodParams; | |
| boolean result = true; | |
| EJBMethodPermission p1,p2; | |
| try { | |
| debug( "-- Construct Test --"); | |
| p1 = new EJBMethodPermission(ejbName,methodName,methodInterface, | |
| methodParams); | |
| if (expectedToSucceed) { | |
| p2 = new EJBMethodPermission(p1.getName(),p1.getActions()); | |
| testSerialization(p2); | |
| 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; | |
| } | |
| if (result == expectedToSucceed) { | |
| if (expectedToSucceed) { | |
| debug( "-- Construct Test Succeeded -------------------------------------"); | |
| } else { | |
| debug( "-- Construct Test Succeeded (negative)---------------------------"); | |
| } | |
| stat.addStatus(description, stat.PASS); | |
| } else { | |
| debug( "-- Construct Test Failed ----------------------------------------"); | |
| stat.addStatus(description, stat.FAIL); | |
| } | |
| } | |
| private static void doEJBMethodPermission( boolean expectedToSucceed, | |
| String ejbName, String methodInterface, Method method) { | |
| String description = "doEJBMethodPermissionWithMethod:" + | |
| expectedToSucceed + "-" + ejbName + | |
| "-" + methodInterface + "-" + method; | |
| boolean result = true; | |
| EJBMethodPermission p1,p2; | |
| String actions = null; | |
| try { | |
| debug( "-- Construct Test -----------------------------------------------"); | |
| p1 = new EJBMethodPermission(ejbName,methodInterface,method); | |
| if (expectedToSucceed) { | |
| p2 = new EJBMethodPermission(p1.getName(),p1.getActions()); | |
| actions = p1.getActions(); | |
| testSerialization(p2); | |
| 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; | |
| } | |
| if (result == expectedToSucceed) { | |
| if (expectedToSucceed) { | |
| debug( "-- Construct Test Succeeded -------------------------------------"); | |
| } else { | |
| debug( "-- Construct Test Succeeded (negative)---------------------------"); | |
| } | |
| stat.addStatus(description, stat.PASS); | |
| } else { | |
| debug( "-- Construct Test Failed ----------------------------------------"); | |
| stat.addStatus(description, stat.FAIL); | |
| } | |
| } | |
| private static void doEJBRoleRefPermission( boolean expectedToSucceed, | |
| String servletName, String roleRef) { | |
| String description = "doEJBRoleRefPermission:" + | |
| expectedToSucceed + "-" + servletName + "-" + roleRef; | |
| boolean result = true; | |
| EJBRoleRefPermission p1,p2; | |
| p1 = null; | |
| try { | |
| debug( "-- Construct Test -----------------------------------------------"); | |
| p1 = new EJBRoleRefPermission(servletName,roleRef); | |
| if (expectedToSucceed) { | |
| p2 = new EJBRoleRefPermission(p1.getName(),p1.getActions()); | |
| testSerialization(p2); | |
| 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; | |
| } | |
| if (result == expectedToSucceed) { | |
| if (expectedToSucceed) { | |
| debug( "-- Construct Test Succeeded -------------------------------------" + p1.hashCode()); | |
| } else { | |
| debug( "-- Construct Test Succeeded (negative)---------------------------"); | |
| } | |
| stat.addStatus(description, stat.PASS); | |
| } else { | |
| debug( "-- Construct Test Failed ----------------------------------------"); | |
| stat.addStatus(description, stat.FAIL); | |
| } | |
| } | |
| private static void doPermissionImplies ( boolean expectedResult, | |
| Permission thisP, Permission p) { | |
| //SEC is added there so that it will not cut off the | |
| //first part with space, an issue in reporting tools | |
| String description = "SEC doPermissionImplies:" + | |
| expectedResult + "-" + thisP + "-" + p; | |
| try { | |
| debug( "-- Permission implies Test ----------------------------------------------"); | |
| if (thisP.implies(p) != expectedResult) { | |
| debug( | |
| (expectedResult ? "unexpected failure:" :"unexpected success:") | |
| + p + (expectedResult ?" not implied by:":" implied by:") + | |
| thisP); | |
| debug( "-- Permission implies Test Failed ----------------------------------------"); | |
| stat.addStatus(description, stat.FAIL); | |
| } else { | |
| debug(p + | |
| (expectedResult ? " implied by:":" not implied by:") + thisP); | |
| debug( "-- Permission implies Test Succeeded -------------------------------------"); | |
| stat.addStatus(description, stat.PASS); | |
| } | |
| } catch( Throwable t ) { | |
| debug("unexpected exception"); | |
| t.printStackTrace(); | |
| debug( "-- Permission implies Test Failed ----------------------------------------"); | |
| stat.addStatus(description, stat.FAIL); | |
| } | |
| } | |
| public static void main ( String[] args ) { | |
| stat.addDescription(testSuite); | |
| String params1[] = { "java.lang.string" }; | |
| String params2[] = { "java.lang.string", "java.lang.int" }; | |
| String params3[] = { "java.lang.string", "java.lang.int," }; | |
| for (int i=0; i<100; i++) { | |
| doEJBMethodPermission(false,"bankbean","withdraw,"); | |
| doEJBMethodPermission(false,"bankbean","withdraw,Home,java.lang.string,"); | |
| doEJBMethodPermission(true,"bankbean",null); | |
| doEJBMethodPermission(true,"bankbean","withdraw"); | |
| doEJBMethodPermission(true,"bankbean","withdraw,Home"); | |
| doEJBMethodPermission(true,"bankbean","withdraw,Home,java.lang.string"); | |
| doEJBMethodPermission(true,"bankbean",",Home"); | |
| doEJBMethodPermission(true,"bankbean",",Home,java.lang.string"); | |
| doEJBMethodPermission(true,"bankbean","withdraw"); | |
| doEJBMethodPermission(true,"bankbean","withdraw,Home"); | |
| doEJBMethodPermission(true,"bankbean","withdraw,,java.lang.string"); | |
| doEJBMethodPermission(true,"bankbean","withdraw,,"); | |
| doEJBMethodPermission(false,"bankBean","withdraw","Home",params3); | |
| doEJBMethodPermission(true,"bankBean","withdraw","Home",params1); | |
| doEJBMethodPermission(true,"bankBean","withdraw","Home",params2); | |
| doEJBMethodPermission(true,"bankBean","withdraw","Home",null); | |
| doEJBMethodPermission(true,"bankBean",null,"Home",params1); | |
| doEJBMethodPermission(true,"bankBean","withdraw",null,params2); | |
| doEJBMethodPermission(true,"bankBean",null,null,null); | |
| EJBMethodPermission a = | |
| new EJBMethodPermission("bankBean","withdraw,Home,java.lang.string"); | |
| EJBMethodPermission b = | |
| new EJBMethodPermission("myBean","withdraw,Home,java.lang.string"); | |
| EJBMethodPermission c = | |
| new EJBMethodPermission("myBean",",Home,java.lang.string"); | |
| EJBMethodPermission d = | |
| new EJBMethodPermission("myBean",",,java.lang.string"); | |
| EJBMethodPermission e = | |
| new EJBMethodPermission("myBean","withdraw,,java.lang.string"); | |
| EJBMethodPermission f = | |
| new EJBMethodPermission("myBean","withdraw,,java.lang.int"); | |
| EJBMethodPermission g = | |
| new EJBMethodPermission("myBean","withdraw,Remote,"); | |
| EJBMethodPermission h = | |
| new EJBMethodPermission("myBean","withdraw","Remote",new String[0]); | |
| testSerialization(a); | |
| testSerialization(b); | |
| testSerialization(c); | |
| testSerialization(d); | |
| testSerialization(e); | |
| testSerialization(f); | |
| testSerialization(g); | |
| testSerialization(h); | |
| doPermissionImplies(false,a,b); | |
| doPermissionImplies(false,b,a); | |
| doPermissionImplies(false,c,a); | |
| doPermissionImplies(false,d,a); | |
| doPermissionImplies(false,e,a); | |
| doPermissionImplies(false,f,a); | |
| doPermissionImplies(false,f,b); | |
| doPermissionImplies(false,c,d); | |
| doPermissionImplies(false,e,d); | |
| doPermissionImplies(true,c,b); | |
| doPermissionImplies(true,d,b); | |
| doPermissionImplies(true,e,b); | |
| doPermissionImplies(true,d,c); | |
| doPermissionImplies(true,g,h); | |
| doPermissionImplies(true,h,g); | |
| doEJBRoleRefPermission(true,"EJBName","customer"); | |
| EJBRoleRefPermission a1,a2,a3,a4; | |
| a1 = new EJBRoleRefPermission("EJBName1","roleRef1"); | |
| a2 = new EJBRoleRefPermission("EJBName1","roleRef2"); | |
| a3 = new EJBRoleRefPermission("EJBName2","roleRef1"); | |
| a4 = new EJBRoleRefPermission("EJBName2","roleRef2"); | |
| testSerialization(a1); | |
| testSerialization(a2); | |
| testSerialization(a3); | |
| testSerialization(a4); | |
| doPermissionImplies(true,a1,a1); | |
| doPermissionImplies(false,a1,a2); | |
| doPermissionImplies(false,a1,a3); | |
| doPermissionImplies(false,a1,a4); | |
| doPermissionImplies(false,a2,a1); | |
| doPermissionImplies(true,a2,a2); | |
| doPermissionImplies(false,a2,a3); | |
| doPermissionImplies(true,a3,a3); | |
| doPermissionImplies(false,a3,a4); | |
| doPermissionImplies(false,a4,a1); | |
| doPermissionImplies(false,a4,a2); | |
| doPermissionImplies(false,a4,a3); | |
| doPermissionImplies(true,a4,a4); | |
| } | |
| Method m[] = TestEJBPerms.class.getMethods(); | |
| EJBMethodPermission p[] = new EJBMethodPermission[m.length]; | |
| for (int i=0; i< m.length; i++) { | |
| doEJBMethodPermission( true, "TestEJBPerms","Home",m[i]); | |
| p[i] = new EJBMethodPermission("testEJBPerms","Home",m[i]); | |
| testSerialization(p[i]); | |
| } | |
| for (int i=0; i< m.length; i++) { | |
| for (int j=0; j<m.length; j++) { | |
| if (i == j) { | |
| doPermissionImplies(true,p[i],p[j]); | |
| } else { | |
| doPermissionImplies(false,p[i],p[j]); | |
| } | |
| } | |
| } | |
| stat.printSummary(); | |
| } | |
| } |