/* * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ import java.io.*; import javax.net.ssl.*; class ServerThread extends TestThread implements HandshakeCompletedListener { // Basic server identity info private int port; private SSLServerSocketFactory factory; private int backlog = 50; private SSLServerSocket ss; // Crypto options ... start with basic ciphers, renegotiation // can use a different set. private String renegotiateSuites []; // Flags controlling testing -- passed to handler private boolean needClientAuth; // Flags controlling testing -- main server thread only private boolean useMT; ServerThread (int port, int backlog, SSLContext ctx) { super ("Server"); setDaemon (true); this.port = port; this.backlog = backlog; factory = ctx.getServerSocketFactory(); } // NEGOTIATION OPTIONS public void setRenegotiateSuites (String suites []) { renegotiateSuites = suites; } // DEFINE WHAT IS BEING TESTED public void setNeedClientAuth (boolean flag) { needClientAuth = flag; } public boolean getNeedClientAuth () { return needClientAuth; } public void setUseMT (boolean flag) { useMT = flag; } public boolean getUseMT () { return useMT; } public int getServerPort() { return port; } public void waitTillReady () { synchronized (this) { while (ss == null) try { wait (); } catch (InterruptedException e) { } } } public void run () { // NOT TESTING: // - connection backlog // - binding to IP address // - base class methods try { synchronized (this) { ss = (SSLServerSocket) factory.createServerSocket(port, backlog); port = ss.getLocalPort(); notify (); } if (needClientAuth) ss.setNeedClientAuth (true); if (basicCipherSuites != null) ss.setEnabledCipherSuites (basicCipherSuites); out.println ("%% Starting " + getName ()); } catch (Throwable t) { synchronized (out) { out.println ("%% Error in " + getName ()); t.printStackTrace (out); } return; } // XXX for N connections ... while (true) { try { SSLSocket s = (SSLSocket) ss.accept (); if (listenHandshake) s.addHandshakeCompletedListener (this); if (verbosity >= 1) out.println ("%% " + getName () + " accepted from " + s.getInetAddress ().getHostName () + ":" + s.getPort ()); ServerHandler handler = new ServerHandler (s); handler.setVerbosity (verbosity); handler.setOutput (out); handler.setDoRenegotiate (doRenegotiate); handler.setInitiateHandshake (initiateHandshake); handler.setListenHandshake (listenHandshake); handler.setReverseRole (reverseRole); handler.setNeedClientAuth (needClientAuth); if (prng != null) handler.setPRNG (prng); if (useMT) handler.start (); else handler.run (); } catch (Throwable t) { synchronized (out) { out.println ("%% Error in " + getName ()); t.printStackTrace (out); } return; } } } public void handshakeCompleted (HandshakeCompletedEvent event) { if (verbosity >= 2) { out.println ("%% Handshook: " + event.getSource ()); // if more verbosity, give cert chain } } }