/* * @(#)ClassFileServer.java 1.5 01/05/10 * * Copyright (c) 1994, 2004, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * -Redistribution of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistribution in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Oracle or the names of * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * This software is provided "AS IS," without a warranty of any * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT * OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, * SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF * THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or * intended for use in the design, construction, operation or * maintenance of any nuclear facility. */ import java.io.*; import java.net.*; import java.security.KeyStore; import javax.net.*; import javax.net.ssl.*; import javax.security.cert.X509Certificate; /* ClassFileServer.java -- a simple file server that can server * Http get request in both clear and secure channel * * The ClassFileServer implements a ClassServer that * reads files from the file system. See the * doc for the "Main" method for how to run this * server. */ public class ClassFileServer extends ClassServer { private String docroot; private static int DefaultServerPort = 2001; /** * Constructs a ClassFileServer. * * @param path the path where the server locates files */ public ClassFileServer(ServerSocket ss, String docroot) throws IOException { super(ss); this.docroot = docroot; } /** * Returns an array of bytes containing the bytes for * the file represented by the argument path. * * @return the bytes for the file * @exception FileNotFoundException if the file corresponding * to path could not be loaded. */ public byte[] getBytes(String path) throws IOException { System.out.println("reading: " + path); File f = new File(docroot + File.separator + path); int length = (int)(f.length()); if (length == 0) { throw new IOException("File length is zero: " + path); } else { FileInputStream fin = new FileInputStream(f); DataInputStream in = new DataInputStream(fin); byte[] bytecodes = new byte[length]; in.readFully(bytecodes); return bytecodes; } } /** * Main method to create the class server that reads * files. This takes two command line arguments, the * port on which the server accepts requests and the * root of the path. To start up the server:

* * java ClassFileServer *

* * new ClassFileServer(port, docroot); * */ public static void main(String args[]) { System.out.println( "USAGE: java ClassFileServer port docroot [TLS [true]]"); System.out.println(""); System.out.println( "If the third argument is TLS, it will start as\n" + "a TLS/SSL file server, otherwise, it will be\n" + "an ordinary file server. \n" + "If the fourth argument is true,it will require\n" + "client authentication as well."); int port = DefaultServerPort; String docroot = ""; if (args.length >= 1) { port = Integer.parseInt(args[0]); } if (args.length >= 2) { docroot = args[1]; } String type = "PlainSocket"; if (args.length >= 3) { type = args[2]; } try { ServerSocketFactory ssf = ClassFileServer.getServerSocketFactory(type); ServerSocket ss = ssf.createServerSocket(port); if (args.length >= 4 && args[3].equals("true")) { ((SSLServerSocket)ss).setNeedClientAuth(true); } new ClassFileServer(ss, docroot); } catch (IOException e) { System.out.println("Unable to start ClassServer: " + e.getMessage()); e.printStackTrace(); } } private static ServerSocketFactory getServerSocketFactory(String type) { if (type.equals("TLS")) { SSLServerSocketFactory ssf = null; try { // set up key manager to do server authentication SSLContext ctx; KeyManagerFactory kmf; KeyStore ks; char[] passphrase = "passphrase".toCharArray(); ctx = SSLContext.getInstance("TLS"); kmf = KeyManagerFactory.getInstance("SunX509"); ks = KeyStore.getInstance("JKS"); ks.load(new FileInputStream("testkeys"), passphrase); kmf.init(ks, passphrase); ctx.init(kmf.getKeyManagers(), null, null); ssf = ctx.getServerSocketFactory(); return ssf; } catch (Exception e) { e.printStackTrace(); } } else { return ServerSocketFactory.getDefault(); } return null; } }