| /* | |
| * Copyright (c) 2013, 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 org.glassfish.jacc.test.uncoveredmethods; | |
| import java.net.*; | |
| import java.io.*; | |
| import java.util.Base64; | |
| import java.util.Enumeration; | |
| import java.util.Hashtable; | |
| import com.sun.ejte.ccl.reporter.SimpleReporterAdapter; | |
| public class Client { | |
| private static SimpleReporterAdapter stat = new SimpleReporterAdapter("appserv-tests"); | |
| private static String testSuite = "Security::UncoveredHTTPMethods"; | |
| private static String contextPathOpen = "/open"; | |
| private static String contextPathDeny = "/deny"; | |
| private String host; | |
| private String port; | |
| private String username; | |
| private String password; | |
| public static void main(String[] args) { | |
| stat.addDescription(testSuite); | |
| Client client = new Client(args); | |
| client.doTests(); | |
| stat.printSummary(); | |
| } | |
| public Client(String[] args) { | |
| host = args[0]; | |
| port = args[1]; | |
| username = args[2]; | |
| password = args[3]; | |
| System.out.println(" Host: " + host); | |
| System.out.println(" Port: " + port); | |
| System.out.println(" Username: " + username); | |
| } | |
| public void doTests() { | |
| testExample1(); | |
| testExample1Put(); | |
| testExample2(); | |
| testExample2Delete(); | |
| testExample3a(); | |
| testExample3aPut(); | |
| testExample3bPost(); | |
| testExample3bDelete(); | |
| testCovered1Post(); | |
| testCovered1Put(); | |
| testCovered2(); | |
| testCovered2Put(); | |
| testCovered3aPost(); | |
| testCovered3aDelete(); | |
| testCovered3b(); | |
| testCovered3bPut(); | |
| } | |
| public void testExample1() { | |
| String servlet = "/Example1"; | |
| String descriptionOpen = contextPathOpen+servlet; | |
| String descriptionDeny = contextPathDeny+servlet; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, null, 302, username, contextPathOpen, output); | |
| int index = output.indexOf("https://"); | |
| if (success && (index != -1)) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, null, 302, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testExample1Put() { | |
| String servlet = "/Example1"; | |
| String method = "PUT"; | |
| String descriptionOpen = contextPathOpen+servlet+"-"+method; | |
| String descriptionDeny = contextPathDeny+servlet+"-"+method; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, method, 200, username, contextPathOpen, output); | |
| if (success) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, method, 403, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testExample2() { | |
| String servlet = "/Example2"; | |
| String descriptionOpen = contextPathOpen+servlet; | |
| String descriptionDeny = contextPathDeny+servlet; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, null, 200, username, contextPathOpen, output); | |
| if (success) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, null, 403, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testExample2Delete() { | |
| String servlet = "/Example2"; | |
| String method = "DELETE"; | |
| String descriptionOpen = contextPathOpen+servlet+"-"+method; | |
| String descriptionDeny = contextPathDeny+servlet+"-"+method; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, method, 403, username, contextPathOpen, output); | |
| if (success) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, method, 403, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testExample3a() { | |
| String servlet = "/Example3a"; | |
| String descriptionOpen = contextPathOpen+servlet; | |
| String descriptionDeny = contextPathDeny+servlet; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, null, 200, username, contextPathOpen, output); | |
| if (success) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, null, 200, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testExample3aPut() { | |
| String servlet = "/Example3a"; | |
| String method = "PUT"; | |
| String descriptionOpen = contextPathOpen+servlet+"-"+method; | |
| String descriptionDeny = contextPathDeny+servlet+"-"+method; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, method, 200, username, contextPathOpen, output); | |
| if (success) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, method, 403, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testExample3bPost() { | |
| String servlet = "/Example3b"; | |
| String method = "POST"; | |
| String descriptionOpen = contextPathOpen+servlet+"-"+method; | |
| String descriptionDeny = contextPathDeny+servlet+"-"+method; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, method, 200, username, contextPathOpen, output); | |
| if (success) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, method, 200, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testExample3bDelete() { | |
| String servlet = "/Example3b"; | |
| String method = "DELETE"; | |
| String descriptionOpen = contextPathOpen+servlet+"-"+method; | |
| String descriptionDeny = contextPathDeny+servlet+"-"+method; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, method, 200, username, contextPathOpen, output); | |
| if (success) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, method, 403, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testCovered1Post() { | |
| String servlet = "/Covered1"; | |
| String method = "POST"; | |
| String descriptionOpen = contextPathOpen+servlet+"-"+method; | |
| String descriptionDeny = contextPathDeny+servlet+"-"+method; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, method, 302, username, contextPathOpen, output); | |
| int index = output.indexOf("https://"); | |
| if (success && (index != -1)) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, method, 302, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testCovered1Put() { | |
| String servlet = "/Covered1"; | |
| String method = "PUT"; | |
| String descriptionOpen = contextPathOpen+servlet+"-"+method; | |
| String descriptionDeny = contextPathDeny+servlet+"-"+method; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, method, 302, username, contextPathOpen, output); | |
| int index = output.indexOf("https://"); | |
| if (success && (index != -1)) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, method, 302, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testCovered2() { | |
| String servlet = "/Covered2"; | |
| String descriptionOpen = contextPathOpen+servlet; | |
| String descriptionDeny = contextPathDeny+servlet; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, null, 302, username, contextPathOpen, output); | |
| int index = output.indexOf("https://"); | |
| if (success && (index != -1)) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, null, 302, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testCovered2Put() { | |
| String servlet = "/Covered2"; | |
| String method = "PUT"; | |
| String descriptionOpen = contextPathOpen+servlet+"-"+method; | |
| String descriptionDeny = contextPathDeny+servlet+"-"+method; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, method, 403, username, contextPathOpen, output); | |
| if (success) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, method, 403, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testCovered3aPost() { | |
| String servlet = "/Covered3a"; | |
| String method = "POST"; | |
| String descriptionOpen = contextPathOpen+servlet+"-"+method; | |
| String descriptionDeny = contextPathDeny+servlet+"-"+method; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, method, 200, username, contextPathOpen, output); | |
| if (success) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, method, 200, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testCovered3aDelete() { | |
| String servlet = "/Covered3a"; | |
| String method = "DELETE"; | |
| String descriptionOpen = contextPathOpen+servlet+"-"+method; | |
| String descriptionDeny = contextPathDeny+servlet+"-"+method; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, method, 200, username, contextPathOpen, output); | |
| if (success) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, method, 200, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testCovered3b() { | |
| String servlet = "/Covered3b"; | |
| String descriptionOpen = contextPathOpen+servlet; | |
| String descriptionDeny = contextPathDeny+servlet; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, null, 302, username, contextPathOpen, output); | |
| int index = output.indexOf("https://"); | |
| if (success && (index != -1)) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, null, 302, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| public void testCovered3bPut() { | |
| String servlet = "/Covered3b"; | |
| String method = "PUT"; | |
| String descriptionOpen = contextPathOpen+servlet+"-"+method; | |
| String descriptionDeny = contextPathDeny+servlet+"-"+method; | |
| StringBuffer output = new StringBuffer(); | |
| boolean success = doIndividualTest(servlet, method, 302, username, contextPathOpen, output); | |
| int index = output.indexOf("https://"); | |
| if (success && (index != -1)) { | |
| stat.addStatus(descriptionOpen, stat.PASS); | |
| } | |
| else stat.addStatus(descriptionOpen, stat.FAIL); | |
| output = new StringBuffer(); | |
| success = doIndividualTest(servlet, method, 302, username, contextPathDeny, output); | |
| if (success) stat.addStatus(descriptionDeny, stat.PASS); | |
| else stat.addStatus(descriptionDeny, stat.FAIL); | |
| } | |
| private boolean doIndividualTest(String servlet, String method, int code, String user, String context, StringBuffer output) { | |
| boolean result = false; | |
| try { | |
| int rtncode; | |
| String url = "http://" + host + ":" + port + context + servlet; | |
| System.out.println("\nInvoking servlet at " + url); | |
| rtncode = invokeServlet(url, method, user, output); | |
| System.out.println("The servlet return code: " + rtncode); | |
| if (rtncode != code) { | |
| System.out.println("Incorrect return code, expecting: " + code); | |
| } | |
| else result = true; | |
| } catch (Exception ex) { | |
| System.out.println("Exception: " + ex.toString()); | |
| //ex.printStackTrace(); | |
| } | |
| return result; | |
| } | |
| private int invokeServlet(String url, String method, String user, StringBuffer output) throws Exception { | |
| String httpMethod = "GET"; | |
| if ((method != null) && (method.length() > 0)) httpMethod = method; | |
| System.out.println("Invoking servlet with HTTP method: " + httpMethod); | |
| URL u = new URL(url); | |
| HttpURLConnection c1 = (HttpURLConnection) u.openConnection(); | |
| c1.setRequestMethod(httpMethod); | |
| if ((user != null) && (user.length() > 0)) { | |
| // Add BASIC header for authentication | |
| String auth = user + ":" + password; | |
| String authEncoded = Base64.getEncoder().encodeToString(auth.getBytes()); | |
| c1.setRequestProperty("Authorization", "Basic " + authEncoded); | |
| } | |
| c1.setUseCaches(false); | |
| // Connect and get the response code and/or output to verify | |
| c1.connect(); | |
| int code = c1.getResponseCode(); | |
| if (code == HttpURLConnection.HTTP_OK) { | |
| InputStream is = null; | |
| BufferedReader input = null; | |
| String line = null; | |
| try { | |
| is = c1.getInputStream(); | |
| input = new BufferedReader(new InputStreamReader(is)); | |
| while ((line = input.readLine()) != null) { | |
| output.append(line); | |
| //System.out.println(line); | |
| } | |
| } | |
| finally { | |
| try { if (is != null) is.close(); } | |
| catch (Exception exc) {} | |
| try { if (input != null) input.close(); } | |
| catch (Exception exc) {} | |
| } | |
| } | |
| else if (code == HttpURLConnection.HTTP_MOVED_TEMP) { | |
| URL redir = new URL(c1.getHeaderField("Location")); | |
| String line = "Servlet redirected to: " + redir.toString(); | |
| output.append(line); | |
| System.out.println(line); | |
| } | |
| return code; | |
| } | |
| } |