[Beepcore-java-commits] CVS: beepcore-java/tls/org/beepcore/beep/profile/tls/jsse TLSProfileJSSE.jav
Status: Beta
Brought to you by:
huston
|
From: Huston F. <hu...@us...> - 2003-07-13 14:27:49
|
Update of /cvsroot/beepcore-java/beepcore-java/tls/org/beepcore/beep/profile/tls/jsse
In directory sc8-pr-cvs1:/tmp/cvs-serv2246/tls/org/beepcore/beep/profile/tls/jsse
Modified Files:
Tag: PIGGYBACKED
TLSProfileJSSE.java
Log Message:
Initial piggybacked changes
Index: TLSProfileJSSE.java
===================================================================
RCS file: /cvsroot/beepcore-java/beepcore-java/tls/org/beepcore/beep/profile/tls/jsse/TLSProfileJSSE.java,v
retrieving revision 1.8
retrieving revision 1.8.2.1
diff -C2 -r1.8 -r1.8.2.1
*** TLSProfileJSSE.java 3 Jun 2003 02:43:43 -0000 1.8
--- TLSProfileJSSE.java 13 Jul 2003 14:27:46 -0000 1.8.2.1
***************
*** 33,37 ****
--- 33,40 ----
import java.security.KeyStore;
+ import java.io.BufferedReader;
import java.io.FileInputStream;
+ import java.io.InputStreamReader;
+ import java.io.IOException;
import org.apache.commons.logging.Log;
***************
*** 52,56 ****
*/
public class TLSProfileJSSE extends TLSProfile
! implements Profile, StartChannelListener {
// Constants
--- 55,59 ----
*/
public class TLSProfileJSSE extends TLSProfile
! implements Profile, StartChannelListener, RequestHandler {
// Constants
***************
*** 178,181 ****
--- 181,255 ----
}
+ class BeepListenerHCL implements HandshakeCompletedListener {
+
+ Channel channel;
+ boolean notifiedHandshake = false;
+ boolean waitingForHandshake = false;
+
+ BeepListenerHCL(Channel tuningChannel)
+ {
+ this.channel = tuningChannel;
+ }
+
+ public void handshakeCompleted(HandshakeCompletedEvent event)
+ {
+ Session oldSession = channel.getSession();
+
+ log.debug("HandshakeCompleted");
+ synchronized (handshakeListeners) {
+ Iterator i = TLSProfileJSSE.handshakeListeners.iterator();
+
+ while (i.hasNext()) {
+ TLSProfileJSSEHandshakeCompletedListener l =
+ (TLSProfileJSSEHandshakeCompletedListener) i.next();
+
+ if (l.handshakeCompleted(oldSession, event) == false) {
+ BEEPError e =
+ new BEEPError(BEEPError.CODE_REQUESTED_ACTION_ABORTED,
+ ERR_TLS_NO_AUTHENTICATION);
+ TLSProfileJSSE.this.abort(e, channel);
+
+ return;
+ }
+ }
+ }
+
+ Hashtable h = new Hashtable();
+
+ try {
+ h.put(SessionCredential.AUTHENTICATOR,
+ event.getPeerCertificateChain()[0].getSubjectDN().getName());
+ h.put(SessionCredential.REMOTE_CERTIFICATE,
+ event.getPeerCertificateChain());
+ } catch (SSLPeerUnverifiedException e) {
+ h.put(SessionCredential.AUTHENTICATOR, "");
+ h.put(SessionCredential.REMOTE_CERTIFICATE, "");
+ }
+
+ ProfileRegistry preg = oldSession.getProfileRegistry();
+
+ preg.removeStartChannelListener(uri);
+
+ Hashtable hash = new Hashtable();
+
+ hash.put(SessionTuningProperties.ENCRYPTION, "true");
+
+ SessionTuningProperties tuning =
+ new SessionTuningProperties(hash);
+
+ // Cause the session to be recreated and reset
+ try {
+ TLSProfileJSSE.this.complete(channel, generateCredential(),
+ new SessionCredential(h), tuning,
+ preg, event.getSocket());
+ } catch (BEEPException e) {
+ BEEPError error =
+ new BEEPError(BEEPError.CODE_REQUESTED_ACTION_ABORTED,
+ ERR_TLS_NO_AUTHENTICATION);
+ TLSProfileJSSE.this.abort(error, channel);
+ }
+ }
+ }
+
/**
* TLS provides encryption and optionally authentication for a session
***************
*** 459,462 ****
--- 533,538 ----
throws StartChannelException
{
+ channel.setRequestHandler(this, true);
+ /*
try {
TCPSession oldSession = (TCPSession) channel.getSession();
***************
*** 533,538 ****
--- 609,670 ----
throw new TuningResetException(uri);
+ */
}
+ public void receiveMSG(MessageMSG msg)
+ {
+ Channel channel = msg.getChannel();
+
+ InputDataStreamAdapter is = msg.getDataStream().getInputStream();
+
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+
+ String data;
+
+ try {
+ try {
+ data = reader.readLine();
+ } catch (IOException e) {
+ msg.sendERR(BEEPError.CODE_PARAMETER_ERROR,
+ "Error reading data");
+ return;
+ }
+
+ if (data.equals(READY1) == false && data.equals(READY2) == false) {
+ msg.sendERR(BEEPError.CODE_PARAMETER_INVALID,
+ "Expected READY element");
+ }
+
+ this.begin(channel);
+
+ msg.sendRPY(new StringOutputDataStream(PROCEED2));
+ } catch (BEEPException e1) {
+ channel.getSession().terminate("unable to send ERR");
+ return;
+ }
+
+ try {
+ Socket oldSocket = ((TCPSession) channel.getSession()).getSocket();
+ /** @TODO add support for serverName */
+ SSLSocket newSocket =
+ (SSLSocket) socketFactory.createSocket(oldSocket,
+ oldSocket.getInetAddress().getHostName(),
+ oldSocket.getPort(),
+ true);
+
+ BeepListenerHCL l = new BeepListenerHCL(channel);
+
+ newSocket.addHandshakeCompletedListener(l);
+ newSocket.setUseClientMode(false);
+ newSocket.setNeedClientAuth(needClientAuth);
+ newSocket.setEnabledCipherSuites(newSocket.getSupportedCipherSuites());
+
+ newSocket.startHandshake();
+ } catch (IOException e) {
+ channel.getSession().terminate("TLS error: " + e.getMessage());
+ return;
+ }
+ }
+
/**
* Called when the underlying BEEP framework receives
|