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

WEB邮件程序

开发平台:

C/C++

  1. /* CVS ID: $Id: WebMailServer.java,v 1.4 2000/04/18 13:12:47 wastl Exp $ */
  2. package net.wastl.webmail.server;
  3. import java.net.*;
  4. import java.io.*;
  5. import java.util.*;
  6. import java.lang.reflect.*;
  7. import javax.mail.Session;
  8. import javax.mail.Provider;
  9. import net.wastl.webmail.standalone.*;
  10. import net.wastl.webmail.debug.ErrorHandler;
  11. import net.wastl.webmail.server.http.*;
  12. import net.wastl.webmail.ui.ContentBar;
  13. import net.wastl.webmail.config.ConfigScheme;
  14. import net.wastl.webmail.misc.Helper;
  15. /*
  16.  * WebMailServer.java
  17.  *
  18.  * Created: Tue Feb  2 12:07:25 1999
  19.  *
  20.  * Copyright (C) 1999-2000 Sebastian Schaffert
  21.  * 
  22.  * This program is free software; you can redistribute it and/or
  23.  * modify it under the terms of the GNU General Public License
  24.  * as published by the Free Software Foundation; either version 2
  25.  * of the License, or (at your option) any later version.
  26.  * 
  27.  * This program is distributed in the hope that it will be useful,
  28.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  29.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  30.  * GNU General Public License for more details.
  31.  * 
  32.  * You should have received a copy of the GNU General Public License
  33.  * along with this program; if not, write to the Free Software
  34.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  35.  */
  36. /**
  37.  * This is WebMails main server. From here most parts will be administered.
  38.  *
  39.  * @author Sebastian Schaffert
  40.  * @version $Revision: 1.4 $
  41.  */
  42. public abstract class WebMailServer  {
  43.     
  44.     protected ConnectionTimer timer;
  45.     protected AuthenticatorHandler ahandler;
  46.     protected PluginHandler phandler;
  47.     protected ToplevelURLHandler uhandler;
  48.     protected ContentBar contentbar;
  49.     protected Hashtable sessions;
  50.     protected static boolean debug=false;
  51.     //    private LogFile logfile;
  52.     public static final String VERSION="0.7.0";
  53.     protected static Provider[] possible_providers;
  54.     protected static Provider[] store_providers;
  55.     protected static Provider[] transport_providers;
  56.     private long start_time;
  57.     protected static Storage storage;
  58.     protected ConfigScheme config_scheme;
  59.     protected static WebMailServer server;
  60.     protected Properties config;
  61.     public WebMailServer() {
  62.     }
  63.     public static boolean getDebug() {
  64. return debug;
  65.     }
  66.     public static void setDebug(boolean b) {
  67. debug=b;
  68.     }
  69.     
  70.     protected void doInit() throws WebMailException {
  71. server=this;
  72. System.err.println("nnWebMail/Java Server v"+VERSION+" going up...");
  73. System.err.println("=====================================n");
  74. System.err.println("Initalizing...");
  75. new SystemCheck(this);
  76. initConfig();
  77. ahandler=new AuthenticatorHandler(this);
  78. System.err.println("- Storage API ("+System.getProperty("webmail.storage")+
  79.    ") and Configuration ... ");
  80. initStorage();
  81. timer=new ConnectionTimer();
  82. sessions=new Hashtable();
  83. System.err.println("  done!");
  84. uhandler=new ToplevelURLHandler(this);
  85. phandler=new PluginHandler(this);
  86. initProviders();
  87. initServers();
  88. storage.initConfigKeys();
  89. storage.log(Storage.LOG_CRIT,"=============================== cut ===============================");
  90. storage.log(Storage.LOG_CRIT,"WebMail/Java Server "+VERSION+" initialization completed.");
  91. System.err.println("Initalization complete.");
  92. start_time=System.currentTimeMillis();
  93.     }
  94.     protected void initStorage() {
  95. /* Storage API */
  96. try {
  97.     Class storage_api=Class.forName(config.getProperty("webmail.storage"));
  98.     Class[] tmp=new Class[1];
  99.     tmp[0]=Class.forName("net.wastl.webmail.server.WebMailServer");
  100.     Constructor cons=storage_api.getConstructor(tmp);
  101.     Object[] sargs=new Object[1];
  102.     sargs[0]=this;
  103.     storage=(Storage)cons.newInstance(sargs);
  104. } catch(InvocationTargetException e) {
  105.     Throwable t=e.getTargetException();
  106.     System.err.println("Nested exception: ");
  107.     t.printStackTrace();
  108.     System.err.println("Fatal error. Could not initialize. Exiting now!");
  109.     System.exit(1);
  110. } catch(Exception e) {
  111.     e.printStackTrace();
  112.     System.err.println("Fatal error. Could not initialize. Exiting now!");
  113.     System.exit(1);
  114. }
  115.     }
  116.     protected void initConfig() {
  117. config_scheme=new ConfigScheme();
  118. config_scheme.configRegisterIntegerKey("SESSION TIMEOUT","3600000",
  119.        "Timeout in milliseconds after which a WebMailSession is closed automatically.");
  120. config_scheme.configRegisterCryptedStringKey("ADMIN PASSWORD","Secret",
  121.      "Password for administrator connections. Shown encrypted, but enter"+
  122.      " plain password to change.");
  123.     }
  124.     protected void initProviders() {
  125. possible_providers=Session.getDefaultInstance(System.getProperties(),null).getProviders();
  126. System.err.println("- Mail providers:");
  127. config_scheme.configRegisterChoiceKey("DEFAULT PROTOCOL","Protocol to be used as default");
  128. config_scheme.getConfigParameter("DEFAULT PROTOCOL").setDefault("imap");
  129. int p_transport=0;
  130. int p_store=0;
  131. for(int i=0; i<possible_providers.length;i++) {
  132.     System.err.println("  * "+possible_providers[i].getProtocol()+" from "+possible_providers[i].getVendor());
  133.     if(possible_providers[i].getType() == Provider.Type.STORE) {
  134. p_store++;
  135. config_scheme.configAddChoice("DEFAULT PROTOCOL",possible_providers[i].getProtocol(),"Use "+
  136.       possible_providers[i].getProtocol()+" from "+possible_providers[i].getVendor());
  137. config_scheme.configRegisterYesNoKey("ENABLE "+possible_providers[i].getProtocol().toUpperCase(),"Enable "+
  138.       possible_providers[i].getProtocol()+" from "+possible_providers[i].getVendor());
  139.     } else {
  140. p_transport++;
  141.     }
  142. }
  143. store_providers=new Provider[p_store];
  144. transport_providers=new Provider[p_transport];
  145. p_store=0;
  146. p_transport=0;
  147. for(int i=0; i<possible_providers.length;i++) {
  148.     if(possible_providers[i].getType() == Provider.Type.STORE) {
  149. store_providers[p_store]=possible_providers[i];
  150. p_store++;
  151.     } else {
  152. transport_providers[p_transport]=possible_providers[i];
  153. p_transport++;
  154.     }
  155. }
  156.     }
  157.     
  158.     /**
  159.      * Init possible servers of this main class
  160.      */
  161.     protected abstract void initServers();
  162.     protected abstract void shutdownServers();
  163.     public abstract Object getServer(String ID);
  164.     public abstract Enumeration getServers();
  165.     public String getBasePath() {
  166. return "";
  167.     }
  168.     public String getImageBasePath() {
  169. return "";
  170.     }
  171.     /*
  172.      * @deprecated Use getServer("HTTP") instead
  173.      */
  174.     public HTTPServer getHTTPServer() {
  175. return (HTTPServer)getServer("HTTP");
  176.     }
  177.     /*
  178.      * @deprecated Use getServer("SSL") instead
  179.      */
  180.     public SSLServer getSSLServer() {
  181. return (SSLServer)getServer("SSL");
  182.     }
  183.     public abstract void reinitServer(String ID);
  184.     /*
  185.      * @deprecated Use reinitServer("HTTP") instead
  186.      */
  187.     public void reinitHTTPServer() {
  188. reinitServer("HTTP");
  189.     }
  190.     /*
  191.      * @deprecated Use reinitServer("SSL") instead
  192.      */
  193.     public void reinitSSLServer() {
  194. reinitServer("SSL");
  195.     }
  196.     public String getBaseURI(HTTPRequestHeader header) {
  197. String host=header.getHeader("Host");
  198. StringTokenizer tok=new StringTokenizer(host,":");
  199. String hostname=tok.nextToken();
  200. int port=80;
  201. if(tok.hasMoreElements()) {
  202.     try {
  203. port=Integer.parseInt(tok.nextToken());
  204.     } catch(NumberFormatException e) {}
  205. }
  206. int ssl_port=443;
  207. try {
  208.     ssl_port=Integer.parseInt(storage.getConfig("ssl port"));
  209. } catch(NumberFormatException e) {}
  210. int http_port=80;
  211. try {
  212.     http_port=Integer.parseInt(storage.getConfig("http port"));
  213. } catch(NumberFormatException e) {}
  214. String protocol="http";
  215. if(port==ssl_port) protocol="https"; else
  216.     if(port==http_port) protocol="http";
  217. return protocol+"://"+host;
  218.     }
  219.     public Provider[] getStoreProviders() {
  220. Vector v=new Vector();
  221. for(int i=0;i<store_providers.length;i++) {
  222.     if(storage.getConfig("ENABLE "+store_providers[i].getProtocol().toUpperCase()).equals("YES")) {
  223. v.addElement(store_providers[i]);
  224.     }
  225. }
  226. Provider[] retval=new Provider[v.size()];
  227. v.copyInto(retval);
  228. return retval;
  229.     }
  230.     public Provider[] getTransportProviders() {
  231. return transport_providers;
  232.     }
  233.     public ConnectionTimer getConnectionTimer() {
  234. return timer;
  235.     }
  236.     public WebMailSession newSession(InetAddress a,HTTPRequestHeader h) throws InvalidPasswordException {
  237. if(sessions.get(Helper.calcSessionCode(a,h)) == null) {
  238.     WebMailSession n=new WebMailSession(this,a,h);
  239.     sessions.put(n.getSessionCode(),n);
  240.     //System.err.println("New session: "+n.getSessionCode());
  241.     timer.addTimeableConnection(n);
  242.     n.login(h);
  243.     return n;
  244. } else {
  245.     WebMailSession n=(WebMailSession)sessions.get(Helper.calcSessionCode(a,h));
  246.     n.login(h);
  247.     return n;
  248. }
  249.     }
  250.     public AdminSession newAdminSession(InetAddress a,HTTPRequestHeader h) throws InvalidPasswordException {
  251. if(sessions.get(Helper.calcSessionCode(a,h)) == null) {
  252.     AdminSession n=new AdminSession(this,a,h);
  253.     sessions.put(n.getSessionCode(),n);
  254.     //System.err.println("New admin session: "+n.getSessionCode());
  255.     timer.addTimeableConnection(n);
  256.     return n;
  257. } else {
  258.     AdminSession n=(AdminSession)sessions.get(Helper.calcSessionCode(a,h));
  259.     return n;
  260. }
  261.     }
  262.     
  263.     public HTTPSession getSession(String sessionid, InetAddress a,HTTPRequestHeader h) throws InvalidPasswordException {
  264. String n=Helper.calcSessionCode(a,h);
  265. //System.err.print("Session requested: "+sessionid);
  266. if(!sessionid.startsWith(n)) {
  267.     throw new InvalidPasswordException("Session-IDs didn't match. Please don't try to hack the server"+
  268. " by fiddling around with the URI's.");
  269. }
  270. if(sessions.get(sessionid) == null) {
  271.     System.err.println(" not found!!!");
  272.     throw new InvalidPasswordException("Mailbox without session or non-existant session-ID."+
  273.        "Maybe the server was restarted or your session has expired. Please try to log in again");
  274. }
  275. //System.err.println(" found.");
  276. return (HTTPSession)sessions.get(sessionid);
  277.     }
  278.     public void removeSession(HTTPSession w) {
  279. storage.log(Storage.LOG_INFO,"Removing session: "+w.getSessionCode());
  280. timer.removeTimeableConnection(w);
  281. sessions.remove(w.getSessionCode());
  282. if(!w.isLoggedOut()) {
  283.     w.logout();
  284. }
  285.     }
  286.     public HTTPSession getSession(String key) {
  287. return (HTTPSession)sessions.get(key);
  288.     }
  289.     public Enumeration getSessions() {
  290. return sessions.keys();
  291.     }
  292.     public static Storage getStorage() {
  293. return storage;
  294.     }
  295.     public PluginHandler getPluginHandler() {
  296. return phandler;
  297.     }
  298.     
  299.     public AuthenticatorHandler getAuthenticatorHandler() {
  300. return ahandler;
  301.     }
  302.     public ToplevelURLHandler getURLHandler() {
  303. return uhandler;
  304.     }
  305.     public ConfigScheme getConfigScheme() {
  306. return config_scheme;
  307.     }
  308.     public void setContentBar(ContentBar c) {
  309. contentbar=c;
  310.     }
  311.     public ContentBar getContentBar() {
  312. return contentbar;
  313.     }
  314.     public String getProperty(String name) {
  315. return config.getProperty(name);
  316.     }
  317.     public void setProperty(String name, String value) {
  318. config.put(name,value);
  319.     }
  320.     /**
  321.        @deprecated Use StorageAPI instead
  322.     */
  323.     public static String getConfig(String key) {
  324. return storage.getConfig(key);
  325.     }
  326.     public void restart() {
  327. System.err.println("Initiating shutdown for child processes:");
  328. Enumeration e=sessions.keys();
  329. System.err.print("- Removing active WebMail sessions ... ");
  330. while(e.hasMoreElements()) {
  331.     HTTPSession w=(HTTPSession)sessions.get(e.nextElement());
  332.     removeSession(w);
  333. }
  334. System.err.println("done!");
  335. shutdownServers();
  336. try {
  337.     Thread.sleep(5000);
  338. } catch(Exception ex) {}
  339. storage.log(Storage.LOG_CRIT,"Shutdown completed successfully. Restarting.");
  340. storage.shutdown();          
  341. System.err.println("Garbage collecting ...");
  342. System.gc();
  343. try {
  344.     doInit();
  345. } catch(WebMailException ex) {
  346.     ex.printStackTrace();
  347.     System.exit(1);
  348. }
  349.     }
  350.     public void shutdown() {
  351. System.err.println("Initiating shutdown for child processes:");
  352. Enumeration e=sessions.keys();
  353. System.err.print("- Removing active WebMail sessions ... ");
  354. while(e.hasMoreElements()) {
  355.     HTTPSession w=(HTTPSession)sessions.get(e.nextElement());
  356.     removeSession(w);
  357. }
  358. System.err.println("done!");
  359. shutdownServers();
  360. storage.log(Storage.LOG_CRIT,"Shutdown completed successfully. Terminating.");
  361. storage.shutdown();
  362. System.err.println("Shutdown complete! Will return to console now.");
  363. System.exit(0);
  364.     }
  365.     public long getUptime() {
  366. return System.currentTimeMillis()-start_time;
  367.     }
  368.     public static String getVersion() {
  369. return "WebMail/Java v"+VERSION;
  370.     }
  371.     public static WebMailServer getServer() {
  372. return server;
  373.     }
  374.     public static String generateMessageID(String user) {
  375. long time=System.currentTimeMillis();
  376. String msgid=Long.toHexString(time)+".JavaWebMail."+VERSION+"."+user;
  377. try {
  378.     msgid+="@"+InetAddress.getLocalHost().getHostName();
  379. } catch(Exception ex){}
  380. return msgid;
  381.     }
  382. } // WebMailServer