blob: af9ad60296a321cc047d50cdeec1c26f5d875181 [file] [log] [blame]
/*
* Copyright (c) 2002, 2014, 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.
*/
/*
* This class may have some race conditions that I haven't
* accounted for. I've tried to put in sufficient sleeps and triggers
* that should cause everything to run correctly.
*
* This was hackish, but to make sure that there were no problems
* with permissions.
*
* Create a client, server, and interested party thread. The
* client and interested threads should receive the same
* session notification.
*/
package com;
import java.net.*;
import java.io.*;
import javax.net.ssl.*;
import java.security.cert.*;
import java.security.*;
public class NotifyHandshakeTest implements HandshakeCompletedListener {
static String pathToStores = "../../../../javax/net/ssl/etc";
static String keyStoreFile = "keystore";
static String trustStoreFile = "truststore";
static String passwd = "passphrase";
volatile static int serverPort = 0;
public boolean set;
SSLSession sess;
static public int triggerState = 0;
static public void trigger() {
triggerState++;
}
public void handshakeCompleted(HandshakeCompletedEvent event) {
set = true;
sess = event.getSession();
trigger();
}
public static void main(String[] args) throws Exception {
String keyFilename =
System.getProperty("test.src", "./") + "/" + pathToStores +
"/" + keyStoreFile;
String trustFilename =
System.getProperty("test.src", "./") + "/" + pathToStores +
"/" + trustStoreFile;
System.setProperty("javax.net.ssl.keyStore", keyFilename);
System.setProperty("javax.net.ssl.keyStorePassword", passwd);
System.setProperty("javax.net.ssl.trustStore", trustFilename);
System.setProperty("javax.net.ssl.trustStorePassword", passwd);
SSLSocketFactory sslsf =
(SSLSocketFactory)SSLSocketFactory.getDefault();
SSLServerSocketFactory sslssf =
(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
/*
* Start off the Server, give time to initialize.
*/
SSLServerSocket sslss =
(SSLServerSocket)sslssf.createServerSocket(serverPort);
sslss.setSoTimeout(30000); // 30 seconds
serverPort = sslss.getLocalPort();
Server server = new Server(sslss);
server.start();
System.out.println("Server started...");
/*
* Create the socket.
*/
SSLSocket socket =
(SSLSocket)sslsf.createSocket("localhost", serverPort);
/*
* Create a second thread also interested in this socket
*/
edu.NotifyHandshakeTestHeyYou heyYou =
new edu.NotifyHandshakeTestHeyYou(socket);
heyYou.start();
while (triggerState < 1) {
Thread.sleep(500);
}
System.out.println("HeyYou thread ready...");
NotifyHandshakeTest listener = new NotifyHandshakeTest();
socket.addHandshakeCompletedListener(listener);
System.out.println("Client starting handshake...");
socket.startHandshake();
System.out.println("Client done handshaking...");
InputStream is = socket.getInputStream();
if ((byte)is.read() != (byte)0x77) {
throw new Exception("problem reading byte");
}
/*
* Wait for HeyYou and the client to get a slice, so
* they can receive their SSLSessions.
*/
while (triggerState < 3) {
Thread.sleep(500);
}
/*
* Grab the variables before reaping the thread.
*/
boolean heyYouSet = heyYou.set;
AccessControlContext heyYouACC = heyYou.acc;
SSLSession heyYouSess = heyYou.ssls;
heyYou.interrupt();
heyYou.join();
server.join();
socket.close();
if (!heyYouSet) {
throw new Exception("HeyYou's wasn't set");
}
if (!listener.set) {
throw new Exception("This' wasn't set");
}
if (heyYouACC.equals(AccessController.getContext())) {
throw new Exception("Access Control Contexts were the same");
}
if (!heyYouSess.equals(listener.sess)) {
throw new Exception("SSLSessions were not equal");
}
System.out.println("Everything Passed");
}
static class Server extends Thread {
SSLServerSocket ss;
Server(SSLServerSocket ss) {
this.ss = ss;
}
public void run() {
try {
System.out.println("Server accepting socket...");
SSLSocket s = (SSLSocket) ss.accept();
System.out.println(
"Server accepted socket...starting handshake");
s.startHandshake();
System.out.println("Server done handshaking");
OutputStream os = s.getOutputStream();
os.write(0x77);
os.flush();
System.out.println("Server returning");
} catch (Exception e) {
System.out.println("Server died");
e.printStackTrace();
}
}
}
}