|
What this is
Other links
The source code/* CVS ID: $Id: WebMailServer.java,v 1.2 2002/10/03 19:44:32 wastl Exp $ */ package net.wastl.webmail.server; import java.net.*; import java.io.*; import java.util.*; import java.lang.reflect.*; import javax.mail.Session; import javax.mail.Provider; import net.wastl.webmail.debug.ErrorHandler; import net.wastl.webmail.server.http.*; import net.wastl.webmail.config.ConfigScheme; import net.wastl.webmail.misc.Helper; import net.wastl.webmail.exceptions.*; /* * WebMailServer.java * * Created: Tue Feb 2 12:07:25 1999 * * Copyright (C) 1999-2000 Sebastian Schaffert * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /** * This is WebMails main server. From here most parts will be administered. * * @author Sebastian Schaffert * @version $Revision: 1.2 $ */ /* 9/24/2000 devink - Updated for new challenge/response auth */ public abstract class WebMailServer { protected ConnectionTimer timer; protected AuthenticatorHandler ahandler; protected PluginHandler phandler; protected ToplevelURLHandler uhandler; protected Hashtable sessions; protected static boolean debug=@debug@; public static final String VERSION="@version@"; protected static Provider[] possible_providers; protected static Provider[] store_providers; protected static Provider[] transport_providers; private long start_time; protected static Storage storage; protected ConfigScheme config_scheme; protected static WebMailServer server; protected Properties config; // Modified by exce, start. /** * Webmail default locale setting. */ protected static Locale defaultLocale = null; // Modified by exce, end. protected static String defaultTheme = null; public WebMailServer() { } /** * If debugging is enabled, send the given message to STDERR. * * @param msg The message */ public static void debugOut(String msg) { if(getDebug()) { System.err.println("DBG: "+msg); } } /** * If debugging is enabled, send the given exception together with an explanatory message * to STDERR. * * @param msg The explanatory message * @param ex The exception */ public void debugOut(String msg, Exception ex) { if(getDebug()) { System.err.println("DBG: "+msg); ex.printStackTrace(); } } public static boolean getDebug() { return debug; } public static void setDebug(boolean b) { debug=b; } protected void doInit() throws WebMailException { server=this; System.err.println("\n\nWebMail/Java Server v"+VERSION+" going up..."); System.err.println("=====================================\n"); System.err.println("Initalizing..."); new SystemCheck(this); initConfig(); // Modified by exce, start /** * Initialize the default locale for webmail. */ if ((config.getProperty("webmail.default.locale.language") == null) || (config.getProperty("webmail.default.locale.country") == null)) defaultLocale = Locale.getDefault(); else defaultLocale = new Locale( config.getProperty("webmail.default.locale.language"), config.getProperty("webmail.default.locale.country") ); System.err.println("- Default Locale: " + defaultLocale.getDisplayName()); // Modified by exce, end /* * Set the default theme to the parameter given in webmail.default.theme * or to "bibop" if unset. */ if(config.getProperty("webmail.default.theme")==null) { defaultTheme="bibop"; } else { defaultTheme=config.getProperty("webmail.default.theme"); } System.err.println("- Default Theme: " + defaultTheme); ahandler=new AuthenticatorHandler(this); System.err.println("- Storage API ("+System.getProperty("webmail.storage")+ ") and Configuration ... "); initStorage(); storage.log(Storage.LOG_CRIT,"=============================== cut ==============================="); storage.log(Storage.LOG_CRIT,"Storage initialized."); timer=new ConnectionTimer(); sessions=new Hashtable(); System.err.println(" done!"); uhandler=new ToplevelURLHandler(this); storage.log(Storage.LOG_CRIT,"URLHandler initialized."); phandler=new PluginHandler(this); storage.log(Storage.LOG_CRIT,"Plugins initialized."); initProviders(); initServers(); storage.initConfigKeys(); storage.log(Storage.LOG_CRIT,"=============================== cut ==============================="); storage.log(Storage.LOG_CRIT,"WebMail/Java Server "+VERSION+" initialization completed."); System.err.println("Initalization complete."); start_time=System.currentTimeMillis(); } protected void initStorage() { /* Storage API */ try { Class storage_api=Class.forName(config.getProperty("webmail.storage")); Class[] tmp=new Class[1]; tmp[0]=Class.forName("net.wastl.webmail.server.WebMailServer"); Constructor cons=storage_api.getConstructor(tmp); Object[] sargs=new Object[1]; sargs[0]=this; storage=(Storage)cons.newInstance(sargs); } catch(InvocationTargetException e) { Throwable t=e.getTargetException(); System.err.println("Nested exception: "); t.printStackTrace(); System.err.println("Fatal error. Could not initialize. Exiting now!"); System.exit(1); } catch(Exception e) { e.printStackTrace(); System.err.println("Fatal error. Could not initialize. Exiting now!"); System.exit(1); } } protected void initConfig() { config_scheme=new ConfigScheme(); config_scheme.configRegisterIntegerKey("SESSION TIMEOUT","3600000", "Timeout in milliseconds after which a WebMailSession is closed automatically."); config_scheme.configRegisterCryptedStringKey("ADMIN PASSWORD","Secret", "Password for administrator connections. Shown encrypted, but enter"+ " plain password to change."); } protected void initProviders() { possible_providers=Session.getDefaultInstance(System.getProperties(),null).getProviders(); System.err.println("- Mail providers:"); config_scheme.configRegisterChoiceKey("DEFAULT PROTOCOL","Protocol to be used as default"); int p_transport=0; int p_store=0; for(int i=0; i<possible_providers.length;i++) { System.err.println(" * "+possible_providers[i].getProtocol()+" from "+possible_providers[i].getVendor()); if(possible_providers[i].getType() == Provider.Type.STORE) { p_store++; config_scheme.configAddChoice("DEFAULT PROTOCOL",possible_providers[i].getProtocol(),"Use "+ possible_providers[i].getProtocol()+" from "+possible_providers[i].getVendor()); config_scheme.configRegisterYesNoKey("ENABLE "+possible_providers[i].getProtocol().toUpperCase(),"Enable "+ possible_providers[i].getProtocol()+" from "+possible_providers[i].getVendor()); } else { p_transport++; } } store_providers=new Provider[p_store]; transport_providers=new Provider[p_transport]; p_store=0; p_transport=0; for(int i=0; i<possible_providers.length;i++) { if(possible_providers[i].getType() == Provider.Type.STORE) { store_providers[p_store]=possible_providers[i]; p_store++; } else { transport_providers[p_transport]=possible_providers[i]; p_transport++; } } /* We want to use IMAP as default, since this is the most useful protocol for WebMail */ config_scheme.setDefaultValue("DEFAULT PROTOCOL","imap"); } /** * Init possible servers of this main class */ protected abstract void initServers(); protected abstract void shutdownServers(); public abstract Object getServer(String ID); public abstract Enumeration getServers(); public String getBasePath() { return ""; } public String getImageBasePath() { return ""; } public abstract void reinitServer(String ID); public String getBaseURI(HTTPRequestHeader header) { String host=header.getHeader("Host"); StringTokenizer tok=new StringTokenizer(host,":"); String hostname=tok.nextToken(); int port=80; if(tok.hasMoreElements()) { try { port=Integer.parseInt(tok.nextToken()); } catch(NumberFormatException e) {} } int ssl_port=443; try { ssl_port=Integer.parseInt(storage.getConfig("ssl port")); } catch(NumberFormatException e) {} int http_port=80; try { http_port=Integer.parseInt(storage.getConfig("http port")); } catch(NumberFormatException e) {} String protocol="http"; if(port==ssl_port) protocol="https"; else if(port==http_port) protocol="http"; return protocol+"://"+host; } public Provider[] getStoreProviders() { Vector v=new Vector(); for(int i=0;i<store_providers.length;i++) { if(storage.getConfig("ENABLE "+store_providers[i].getProtocol().toUpperCase()).equals("YES")) { v.addElement(store_providers[i]); } } Provider[] retval=new Provider[v.size()]; v.copyInto(retval); return retval; } public Provider[] getTransportProviders() { return transport_providers; } public ConnectionTimer getConnectionTimer() { return timer; } public static Storage getStorage() { return storage; } public PluginHandler getPluginHandler() { return phandler; } public AuthenticatorHandler getAuthenticatorHandler() { return ahandler; } public ToplevelURLHandler getURLHandler() { return uhandler; } public ConfigScheme getConfigScheme() { return config_scheme; } public String getProperty(String name) { return config.getProperty(name); } public static String getDefaultTheme() { return defaultTheme; } // Modified by exce, start /** * Return default locale. * * Related code: * 1. login screen: * server/TopLevelHandler.java line #110. * 2. webmail.css: * plugins/PassThroughPlugin.java line #77. * 3. user's default locale setting: * xml/XMLUserData.java line #82. * * @return default locale. */ public static Locale getDefaultLocale() { return defaultLocale; } // Modified by exce, end public void setProperty(String name, String value) { config.put(name,value); } /** @deprecated Use StorageAPI instead */ public static String getConfig(String key) { return storage.getConfig(key); } public void restart() { System.err.println("Initiating shutdown for child processes:"); Enumeration e=sessions.keys(); System.err.print("- Removing active WebMail sessions ... "); while(e.hasMoreElements()) { HTTPSession w=(HTTPSession)sessions.get(e.nextElement()); removeSession(w); } System.err.println("done!"); shutdownServers(); try { Thread.sleep(5000); } catch(Exception ex) {} storage.log(Storage.LOG_CRIT,"Shutdown completed successfully. Restarting."); storage.shutdown(); System.err.println("Garbage collecting ..."); System.gc(); try { doInit(); } catch(WebMailException ex) { ex.printStackTrace(); System.exit(1); } } public void shutdown() { System.err.println("Initiating shutdown for child processes:"); Enumeration e=sessions.keys(); System.err.print("- Removing active WebMail sessions ... "); while(e.hasMoreElements()) { HTTPSession w=(HTTPSession)sessions.get(e.nextElement()); removeSession(w); } System.err.println("done!"); shutdownServers(); storage.log(Storage.LOG_CRIT,"Shutdown completed successfully. Terminating."); storage.shutdown(); System.err.println("Shutdown complete! Will return to console now."); System.exit(0); } public long getUptime() { return System.currentTimeMillis()-start_time; } public static String getVersion() { return "WebMail/Java v"+VERSION+", built with JDK @java-version@"; } public static String getCopyright() { return "(c)1999-@year@ Sebastian Schaffert and others"; } public static WebMailServer getServer() { return server; } public static String generateMessageID(String user) { long time=System.currentTimeMillis(); String msgid=Long.toHexString(time)+".JavaWebMail."+VERSION+"."+user; try { msgid+="@"+InetAddress.getLocalHost().getHostName(); } catch(Exception ex){} return msgid; } public void removeSession(HTTPSession w) { storage.log(Storage.LOG_INFO,"Removing session: "+w.getSessionCode()); timer.removeTimeableConnection(w); sessions.remove(w.getSessionCode()); if(!w.isLoggedOut()) { w.logout(); } } public HTTPSession getSession(String key) { return (HTTPSession)sessions.get(key); } public Enumeration getSessions() { return sessions.keys(); } } // WebMailServer |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.