[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-09-15 15:23:37
|
Update of /cvsroot/beepcore-java/beepcore-java/tls/org/beepcore/beep/profile/tls/jsse In directory sc8-pr-cvs1:/tmp/cvs-serv21224/tls/org/beepcore/beep/profile/tls/jsse Modified Files: TLSProfileJSSE.java Log Message: Merge from PIGGYBACK branch 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.9 diff -C2 -r1.8 -r1.9 *** TLSProfileJSSE.java 3 Jun 2003 02:43:43 -0000 1.8 --- TLSProfileJSSE.java 15 Sep 2003 15:23:32 -0000 1.9 *************** *** 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,481 **** throws StartChannelException { ! try { ! TCPSession oldSession = (TCPSession) channel.getSession(); ! // if the data is <ready/> then respond with <proceed/> ! if (data != null) { ! // If data is a ready, prepare a message of proceed to ! // send to the begin call ! if (data.equals(READY1) || data.equals(READY2)) { ! data = PROCEED2; ! } } ! // Freeze this Peer ! // Send a profile back with data in the 3rd argument ! this.begin(channel, uri, data); ! // Negotiate TLS with the Socket ! Socket oldSocket = oldSession.getSocket(); SSLSocket newSocket = (SSLSocket) socketFactory.createSocket(oldSocket, --- 533,574 ---- throws StartChannelException { ! channel.setRequestHandler(this, true); ! } ! 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, *************** *** 483,487 **** oldSocket.getPort(), true); ! TLSHandshake l = new TLSHandshake(); newSocket.addHandshakeCompletedListener(l); --- 576,581 ---- oldSocket.getPort(), true); ! ! BeepListenerHCL l = new BeepListenerHCL(channel); newSocket.addHandshakeCompletedListener(l); *************** *** 490,538 **** newSocket.setEnabledCipherSuites(newSocket.getSupportedCipherSuites()); - l.session = channel.getSession(); - newSocket.startHandshake(); ! ! synchronized (l) { ! if (!l.notifiedHandshake) { ! l.waitingForHandshake = true; ! ! l.wait(); ! ! l.waitingForHandshake = false; ! } ! } ! ! // Consider the Profile Registry ! ProfileRegistry preg = oldSession.getProfileRegistry(); ! ! preg.removeStartChannelListener(uri); ! ! if (abortSession) { ! this.abort(new BEEPError(451, ERR_TLS_NO_AUTHENTICATION), ! channel); ! } else { ! Hashtable hash = new Hashtable(); ! ! hash.put(SessionTuningProperties.ENCRYPTION, "true"); ! ! SessionTuningProperties tuning = ! new SessionTuningProperties(hash); ! ! // Cause the session to be recreated and reset ! this.complete(channel, generateCredential(), l.cred, tuning, ! preg, newSocket); ! } ! } catch (Exception x) { ! ! // @todo should be more detailed ! log.error(x.getMessage()); ! ! throw new StartChannelException(450, x.getMessage()); } - - throw new TuningResetException(uri); } ! /** * Called when the underlying BEEP framework receives --- 584,594 ---- newSocket.setEnabledCipherSuites(newSocket.getSupportedCipherSuites()); newSocket.startHandshake(); ! } catch (IOException e) { ! channel.getSession().terminate("TLS error: " + e.getMessage()); ! return; } } ! /** * Called when the underlying BEEP framework receives |