SSLServer.java
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:7k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /* CVS ID: $Id: SSLServer.java,v 1.2 2000/04/06 08:02:02 wastl Exp $ */
  2. package net.wastl.webmail.standalone;
  3. import java.io.*;
  4. import java.net.*;
  5. import java.util.*;
  6. import java.security.*;
  7. import javax.net.ssl.*;
  8. import de.tu_darmstadt.sp.ssl.*;
  9. import net.wastl.webmail.config.ConfigurationListener;
  10. import net.wastl.webmail.server.*;
  11. import net.wastl.webmail.server.http.*;
  12. import net.wastl.webmail.ui.html.*;
  13. import net.wastl.webmail.debug.ErrorHandler;
  14. /*
  15.  * HTTPServer.java
  16.  *
  17.  * Created: Tue Feb  2 12:15:48 1999
  18.  *
  19.  * Copyright (C) 1999-2000 Sebastian Schaffert
  20.  * 
  21.  * This program is free software; you can redistribute it and/or
  22.  * modify it under the terms of the GNU General Public License
  23.  * as published by the Free Software Foundation; either version 2
  24.  * of the License, or (at your option) any later version.
  25.  * 
  26.  * This program is distributed in the hope that it will be useful,
  27.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  28.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  29.  * GNU General Public License for more details.
  30.  * 
  31.  * You should have received a copy of the GNU General Public License
  32.  * along with this program; if not, write to the Free Software
  33.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  34.  */
  35. /**
  36.  *
  37.  *
  38.  *
  39.  * @author Sebastian Schaffert
  40.  * @version $Revision: 1.2 $
  41.  */
  42. public class SSLServer extends HTTPServer implements ConfigurationListener {
  43.     private boolean shutdown=false;
  44.     protected boolean handshake_completed;
  45.     private int port;
  46.     private ConnectionTimer timer;
  47.     private SSLServerSocket socket;
  48.     //private SSLContext serverContext;
  49.     private WebMailServer parent;
  50.     private Hashtable html_loaders;
  51.     private long start_time;
  52.     private long nr_connections=0;
  53.     public SSLServer(WebMailServer parent) {
  54. super();
  55. System.err.print("- SSL Server ...");
  56. parent.getConfigScheme().configRegisterIntegerKey(this,"SSL PORT","6790","Port where the SSL server will accept connections");
  57. parent.getConfigScheme().configRegisterStringKey(this,"SSL CERTS","../data/ssl/certs/","Path to SSL certificates");
  58. parent.getConfigScheme().configRegisterStringKey(this,"SSL ADDRESS","0.0.0.0","Address for the SSL Server to listen on (default: all addresses)");
  59. parent.getConfigScheme().configRegisterIntegerKey(this,"SSL BACKLOG","50","SSL Server Socket Backlog (how many connections to hold in Queue)");
  60. parent.getConfigScheme().configRegisterIntegerKey(this,"SSL CONNECTION LIMIT","50","Maximum number of simultaneous connections (reduce to avoid server crash on machines with low memory, 20 should be ok for medium-high load machines)");
  61. parent.getConfigScheme().configRegisterYesNoKey(this,"SSL ENABLE","Enable the SSL server.");
  62. this.timer=parent.getConnectionTimer();
  63. this.parent=parent;
  64. port=6790;
  65. try {
  66.     port=Integer.parseInt(parent.getStorage().getConfig("SSL PORT"));
  67. } catch(NumberFormatException e) {
  68. }
  69. max_connections=50;
  70. current_connections=0;
  71. try {
  72.     max_connections=Integer.parseInt(parent.getStorage().getConfig("SSL CONNECTION LIMIT"));
  73. } catch(NumberFormatException e) {
  74. }
  75. int backlog=50;
  76. try {
  77.     backlog=Integer.parseInt(parent.getStorage().getConfig("SSL BACKLOG"));
  78. } catch(NumberFormatException e) {
  79. }
  80. if(parent.getStorage().getConfig("SSL ENABLE").toUpperCase().equals("YES")) {
  81.     try {
  82. Properties props=System.getProperties();
  83. props.put("iti.ssl.ca_file",parent.getConfig("SSL CERTS")+"/ca.pem");
  84. props.put("iti.ssl.cert_file",parent.getConfig("SSL CERTS")+"/cert.pem");
  85. props.put("iti.ssl.key_file",parent.getConfig("SSL CERTS")+"/key.pem");
  86. System.setProperties(props);
  87. System.loadLibrary("itissl");
  88. SSLSocketFactory.setDefault(new SSLeaySocketFactory());
  89. SSLServerSocketFactory.setDefault(new SSLeayServerSocketFactory());
  90. // get a server socket and listen..
  91. SSLServerSocketFactory factory = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
  92. socket = (SSLServerSocket)factory.createServerSocket(port,backlog,
  93.      InetAddress.getByName(parent.getStorage().getConfig("SSL ADDRESS")));
  94. socket.setNeedClientAuth(false);
  95. socket.setSoTimeout(1000);
  96. this.start();
  97. System.err.println(" initialization complete. Listening on port "+port+".");
  98. start_time=System.currentTimeMillis();
  99.     } catch(Throwable ex) {
  100. //new ErrorHandler(ex);
  101. System.err.println(" initialization failed! ("+ex.getMessage()+")");
  102.     }
  103. } else {
  104.     System.err.println(" SSL disabled in configuration. Server not started.");
  105. }
  106.     }
  107.     public void shutdown() {
  108. shutdown=true;
  109. System.err.print("- SSL Server shutdown requested ...");
  110. try {
  111.     socket.close();
  112. } catch(Exception e) {}
  113. try {
  114.     // Give connections enough time to terminate
  115.     sleep(2000);
  116. } catch(InterruptedException ex) {}
  117. //this.stop();
  118. System.err.println("complete!");
  119.     }
  120.     public String getStatus() {
  121. String status;
  122. if(isAlive()) {
  123.     status="SSL Server listening on "+parent.getStorage().getConfig("SSL ADDRESS")+", Port "+port;
  124.     // Disabled because it hangs on certain systems
  125.     //status="SSL Server listening on "+socket.getInetAddress()+", Port "+port;
  126.     long up=System.currentTimeMillis()-start_time;
  127.     status+="nUptime: "+up/1000+" secondsn";
  128.     status+="Number of connections so far: "+nr_connections+", average "+ (nr_connections*60000/up) +" conn/minn";
  129.     status+="There are currently "+current_connections+" connections out of a maximum of "+max_connections+".n";
  130. } else {
  131.     status="SSL Server disabled.";
  132. }
  133. return status;
  134.     }
  135.     public void notifyConfigurationChange(String key) {
  136. parent.reinitServer("SSL");
  137.     }
  138.     public void run() {
  139. while(!shutdown) {
  140.     /* Enter critical resource. Connections must release this on termination! */
  141.     if(current_connections < max_connections) {
  142. try {
  143.     if(Runtime.getRuntime().freeMemory() > required_free_memory) {
  144. //Runtime.getRuntime().traceInstructions(true);
  145. SSLSocket client=(SSLSocket)socket.accept();
  146. client.setNeedClientAuth(false);
  147. System.err.println("Handshake completed");
  148. System.err.println(client.toString());
  149. Connection conn=new Connection(client,parent,this);
  150. nr_connections++;
  151. //Runtime.getRuntime().traceInstructions(false);
  152.     } else {
  153. parent.getStorage().log(Storage.LOG_ERR,"Error: Ran out of memory. Garbage collecting."+
  154. " You might want to increase the minimum memory size in webmail.sh to avoid this.");
  155. System.gc();
  156.     }
  157. } catch(InterruptedIOException ex) {
  158. } catch(IOException ex) {
  159.     if(!ex.getMessage().equals("Socket closed")) {
  160. //new ErrorHandler(ex);
  161. ex.printStackTrace();
  162.     }
  163. }
  164.     } else {
  165. parent.getStorage().log(Storage.LOG_DEBUG,"SSL Server: Maximum number of SSL connections reached."+
  166. " You might want to increase the SSL CONNECTION LIMIT if your server is fast enough");
  167. try {
  168.     synchronized(this) {
  169. wait();
  170.     }
  171. } catch(InterruptedException ex) {}
  172.     }
  173. }
  174.     }
  175. } // Server