⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webmailserver.java

📁 java 开发的一个电子邮局,挺实用的
💻 JAVA
字号:
/* CVS ID: $Id: WebMailServer.java,v 1.10 2001/06/12 09:29:12 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.ui.ContentBar;
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.10 $
 */
/* 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 ContentBar contentbar;

    protected Hashtable sessions;

    protected static boolean debug=@debug@;

    //    private LogFile logfile;

    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();

	timer=new ConnectionTimer();
	sessions=new Hashtable();

	System.err.println("  done!");

	uhandler=new ToplevelURLHandler(this);

	phandler=new PluginHandler(this);

	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 void setContentBar(ContentBar c) {
	contentbar=c;
    }

    public ContentBar getContentBar() {
	return contentbar;
    }


    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 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -