1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/* 2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Conditions Of Use 3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software was developed by employees of the National Institute of 5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Standards and Technology (NIST), an agency of the Federal Government. 6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Pursuant to title 15 Untied States Code Section 105, works of NIST 7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * employees are not subject to copyright protection in the United States 8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * and are considered to be in the public domain. As a result, a formal 9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * license is not needed to use the software. 10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software is provided by NIST as a service and is expressly 12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED 13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF 14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT 15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * AND DATA ACCURACY. NIST does not warrant or make any representations 16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * regarding the use of the software or the results thereof, including but 17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * not limited to the correctness, accuracy, reliability or usefulness of 18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * the software. 19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Permission to use this software is contingent upon your acceptance 21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * of the terms of this agreement 22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * . 24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/* This class is entirely derived from TCPMessageProcessor, 27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * by making some minor changes. 28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Daniel J. Martinez Manzano <dani@dif.um.es> 30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Acknowledgement: Jeff Keyser suggested that a 31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Stop mechanism be added to this. Niklas Uhrberg suggested that 32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * a means to limit the number of simultaneous active connections 33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * should be added. Mike Andrews suggested that the thread be 34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * accessible so as to implement clean stop using Thread.join(). 35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/****************************************************************************** 39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Product of NIST/ITL Advanced Networking Technologies Division (ANTD). * 40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ******************************************************************************/ 41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.javax.sip.stack; 42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.HostPort; 44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.SipStackImpl; 45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.net.ssl.SSLException; 47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.net.ssl.SSLServerSocket; 48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.net.ssl.SSLSocket; 49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.io.IOException; 51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.net.*; 52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.ArrayList; 53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Collection; 54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Hashtable; 55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Iterator; 56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/** 58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Sit in a loop waiting for incoming tls connections and start a new thread to handle each new 59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * connection. This is the active object that creates new TLS MessageChannels (one for each new 60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * accept socket). 61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 $Revision: 1.23 $ $Date: 2009/12/06 15:58:39 $ 63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan <br/> 65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class TLSMessageProcessor extends MessageProcessor { 68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected int nConnections; 70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private boolean isRunning; 72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private Hashtable<String, TLSMessageChannel> tlsMessageChannels; 74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private ServerSocket sock; 76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected int useCount = 0; 78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private ArrayList<TLSMessageChannel> incomingTlsMessageChannels; 80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Constructor. 83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param ipAddress -- inet address where I am listening. 85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param sipStack SIPStack structure. 86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param port port where this message processor listens. 87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected TLSMessageProcessor(InetAddress ipAddress, SIPTransactionStack sipStack, int port) { 89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang super(ipAddress, port, "tls",sipStack); 90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sipStack = sipStack; 91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.tlsMessageChannels = new Hashtable<String, TLSMessageChannel>(); 92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.incomingTlsMessageChannels = new ArrayList<TLSMessageChannel>(); 93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Start the processor. 98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void start() throws IOException { 100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Thread thread = new Thread(this); 101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang thread.setName("TLSMessageProcessorThread"); 102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // ISSUE 184 103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang thread.setPriority(Thread.MAX_PRIORITY); 104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang thread.setDaemon(true); 105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.sock = sipStack.getNetworkLayer().createSSLServerSocket(this.getPort(), 0, 107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.getIpAddress()); 108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ((SSLServerSocket) this.sock).setNeedClientAuth(false); 109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ((SSLServerSocket) this.sock).setUseClientMode(false); 110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ((SSLServerSocket) this.sock).setWantClientAuth(true); 111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String []enabledCiphers = ((SipStackImpl)sipStack).getEnabledCipherSuites(); 112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ((SSLServerSocket) this.sock).setEnabledCipherSuites(enabledCiphers); 113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ((SSLServerSocket)this.sock).setWantClientAuth(true); 114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.isRunning = true; 117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang thread.start(); 118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Run method for the thread that gets created for each accept socket. 123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void run() { 125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Accept new connectins on our socket. 126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang while (this.isRunning) { 127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang synchronized (this) { 129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // sipStack.maxConnections == -1 means we are 130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // willing to handle an "infinite" number of 131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // simultaneous connections (no resource limitation). 132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // This is the default behavior. 133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang while (sipStack.maxConnections != -1 134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang && this.nConnections >= sipStack.maxConnections) { 135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.wait(); 137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (!this.isRunning) 139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return; 140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (InterruptedException ex) { 141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang break; 142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.nConnections++; 145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Socket newsock = sock.accept(); 148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sipStack.isLoggingEnabled()) 150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logDebug("Accepting new connection!"); 151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Note that for an incoming message channel, the 154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // thread is already running 155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang incomingTlsMessageChannels.add(new TLSMessageChannel(newsock, sipStack, this)); 157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (SocketException ex) { 158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if ( this.isRunning ) { 159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logError( 160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang "Fatal - SocketException occured while Accepting connection", ex); 161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.isRunning = false; 162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang break; 163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (SSLException ex) { 165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.isRunning = false; 166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logError( 167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang "Fatal - SSSLException occured while Accepting connection", ex); 168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang break; 169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (IOException ex) { 170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Problem accepting connection. 171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logError("Problem Accepting Connection", ex); 172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang continue; 173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (Exception ex) { 174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logError("Unexpected Exception!", ex); 175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Returns the stack. 181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return my sip stack. 183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public SIPTransactionStack getSIPStack() { 185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return sipStack; 186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Stop the message processor. Feature suggested by Jeff Keyser. 190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public synchronized void stop() { 192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (!isRunning) 193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return; 194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang isRunning = false; 196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sock.close(); 198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (IOException e) { 199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang e.printStackTrace(); 200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Collection en = tlsMessageChannels.values(); 203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang for (Iterator it = en.iterator(); it.hasNext();) { 204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang TLSMessageChannel next = (TLSMessageChannel) it.next(); 205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang next.close(); 206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang for (Iterator incomingMCIterator = incomingTlsMessageChannels.iterator(); incomingMCIterator 208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .hasNext();) { 209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang TLSMessageChannel next = (TLSMessageChannel) incomingMCIterator.next(); 210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang next.close(); 211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.notify(); 213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected synchronized void remove(TLSMessageChannel tlsMessageChannel) { 217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String key = tlsMessageChannel.getKey(); 219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sipStack.isLoggingEnabled()) { 220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logDebug(Thread.currentThread() + " removing " + key); 221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** May have been removed already */ 224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (tlsMessageChannels.get(key) == tlsMessageChannel) 225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.tlsMessageChannels.remove(key); 226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang incomingTlsMessageChannels.remove(tlsMessageChannel); 228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public synchronized MessageChannel createMessageChannel(HostPort targetHostPort) 231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throws IOException { 232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String key = MessageChannel.getKey(targetHostPort, "TLS"); 233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (tlsMessageChannels.get(key) != null) { 234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return (TLSMessageChannel) this.tlsMessageChannels.get(key); 235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang TLSMessageChannel retval = new TLSMessageChannel(targetHostPort.getInetAddress(), 237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang targetHostPort.getPort(), sipStack, this); 238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.tlsMessageChannels.put(key, retval); 239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang retval.isCached = true; 240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sipStack.isLoggingEnabled()) { 241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logDebug("key " + key); 242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logDebug("Creating " + retval); 243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return retval; 245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected synchronized void cacheMessageChannel(TLSMessageChannel messageChannel) { 249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String key = messageChannel.getKey(); 250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang TLSMessageChannel currentChannel = (TLSMessageChannel) tlsMessageChannels.get(key); 251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (currentChannel != null) { 252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sipStack.isLoggingEnabled()) 253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logDebug("Closing " + key); 254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang currentChannel.close(); 255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sipStack.isLoggingEnabled()) 257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logDebug("Caching " + key); 258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.tlsMessageChannels.put(key, messageChannel); 259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public synchronized MessageChannel createMessageChannel(InetAddress host, int port) 263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throws IOException { 264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String key = MessageChannel.getKey(host, port, "TLS"); 266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (tlsMessageChannels.get(key) != null) { 267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return (TLSMessageChannel) this.tlsMessageChannels.get(key); 268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang TLSMessageChannel retval = new TLSMessageChannel(host, port, sipStack, this); 270600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.tlsMessageChannels.put(key, retval); 271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang retval.isCached = true; 272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sipStack.isLoggingEnabled()) { 273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logDebug("key " + key); 274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang sipStack.getStackLogger().logDebug("Creating " + retval); 275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return retval; 277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (UnknownHostException ex) { 279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new IOException(ex.getMessage()); 280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * TLS can handle an unlimited number of bytes. 285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 286600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public int getMaximumMessageSize() { 287600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return Integer.MAX_VALUE; 288600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 289600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 290600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean inUse() { 291600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.useCount != 0; 292600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 293600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 294600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 295600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Default target port for TLS 296600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 297600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public int getDefaultTargetPort() { 298600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return 5061; 299600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 300600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 301600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 302600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * TLS is a secure protocol. 303600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 304600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean isSecure() { 305600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return true; 306600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 307600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang} 308