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

WEB邮件程序

开发平台:

C/C++

  1. /* CVS ID: $Id: WebMailServlet.java,v 1.4 2000/04/18 13:13:24 wastl Exp $ */
  2. package net.wastl.webmail.servlet;
  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.debug.LogFile;
  10. import net.wastl.webmail.server.http.*;
  11. import net.wastl.webmail.server.*;
  12. import net.wastl.webmail.ui.*;
  13. import net.wastl.webmail.ui.html.*;
  14. import javax.servlet.*;
  15. import javax.servlet.http.*;
  16. /*
  17.  * WebMailServer.java
  18.  *
  19.  * Created: Oct 1999
  20.  *
  21.  * Copyright (C) 1999-2000 Sebastian Schaffert
  22.  * 
  23.  * This program is free software; you can redistribute it and/or
  24.  * modify it under the terms of the GNU General Public License
  25.  * as published by the Free Software Foundation; either version 2
  26.  * of the License, or (at your option) any later version.
  27.  * 
  28.  * This program is distributed in the hope that it will be useful,
  29.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  30.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  31.  * GNU General Public License for more details.
  32.  * 
  33.  * You should have received a copy of the GNU General Public License
  34.  * along with this program; if not, write to the Free Software
  35.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  36.  */
  37. /**
  38.  * This is WebMails main server. From here most parts will be administered.
  39.  * This is the servlet implementation of WebMail (introduced in 0.6.1)
  40.  *
  41.  * Created: Tue Feb  2 12:07:25 1999
  42.  *
  43.  * @author Sebastian Schaffert
  44.  * @version $Revision: 1.4 $
  45.  */
  46. public class WebMailServlet extends net.wastl.webmail.server.WebMailServer implements Servlet {
  47.     ServletConfig srvlt_config;
  48.     /** Size of the chunks that are sent. Must not be greater than 65536 */
  49.     private static final int chunk_size=8192;
  50.     protected String basepath;
  51.     protected String imgbase;
  52.     
  53.     public WebMailServlet() {
  54.     }
  55.     
  56.     public void init(ServletConfig config) throws ServletException {
  57. System.err.println("Init");
  58. srvlt_config=config;
  59. this.config=new Properties();
  60. Enumeration enum=config.getInitParameterNames();
  61. while(enum.hasMoreElements()) {
  62.     String s=(String)enum.nextElement();
  63.     this.config.put(s,config.getInitParameter(s));
  64.     System.err.println(s+": "+config.getInitParameter(s));
  65. }
  66. try {
  67.     doInit();
  68. } catch(Exception e) {
  69.     e.printStackTrace();
  70.     throw new ServletException("Could not intialize.");
  71. }
  72. if(config.getInitParameter("webmail.basepath")==null) {
  73.     config.getServletContext().log("Warning: webmail.basepath initArg should be set to the WebMail Servlet's base path");
  74.     basepath="";
  75. } else {
  76.     basepath = config.getInitParameter("webmail.basepath");
  77. }
  78. if(config.getInitParameter("webmail.imagebase") == null) {
  79.     config.getServletContext().log("Error: webmail.basepath initArg should be set to the WebMail Servlet's base path");
  80.     imgbase="";
  81. } else {     
  82.     imgbase = config.getInitParameter("webmail.imagebase");
  83. }
  84.     }
  85.     public ServletConfig getServletConfig() {
  86. return srvlt_config;
  87.     }
  88.     public String getServletInfo() {
  89. return getVersion()+"n(c)2000 by Sebastian SchaffertnThis software is distributed under the GNU Lesser General Public License";
  90.     }
  91.     public void destroy() {
  92. shutdown();
  93.     }
  94.     public void service(ServletRequest req1, ServletResponse res1) throws ServletException {
  95. HttpServletRequest req=(HttpServletRequest)req1;
  96. HttpServletResponse res=(HttpServletResponse)res1;
  97. HTTPRequestHeader http_header=new HTTPRequestHeader();
  98. // Unfortunately, the servlet engine doesn't support multipart/form-data.
  99. // Our HTTPRequestHeader does, however.:-)
  100. //  Enumeration test=req.getParameterNames();
  101. //  while(test.hasMoreElements()) {
  102. //      String param=(String)test.nextElement();
  103. //      http_header.setContent(param,req.getParameter(param));
  104. //      System.err.println("Content "+param+"="+req.getParameter(param));
  105. //  }
  106. Enumeration en=req.getHeaderNames();
  107. while(en.hasMoreElements()) {
  108.     String s=(String)en.nextElement();
  109.     http_header.setHeader(s,req.getHeader(s));
  110. }
  111. if(req.getPathInfo()!=null) {
  112.     http_header.setPath(req.getPathInfo());
  113. } else {
  114.     http_header.setPath("/");
  115. }
  116. InetAddress addr;
  117. try {
  118.     addr=InetAddress.getByName(req.getRemoteHost());
  119. } catch(UnknownHostException e) {
  120.     try {
  121. addr=InetAddress.getByName(req.getRemoteAddr());
  122.     } catch(Exception ex) {
  123. throw new ServletException("Remote host must identify!");
  124.     }
  125. }
  126. HTMLDocument content=null;
  127. int err_code=400;
  128. HTTPSession sess=null;
  129. try {
  130.       BufferedReader in=new BufferedReader(req.getReader());
  131.     PrintWriter out=new PrintWriter(res.getOutputStream());
  132.     StringBuffer str=new StringBuffer();
  133.     int total=0;
  134.     try {
  135. char[] buf=new char[8192];
  136. int read=1;
  137. int cl=req.getContentLength();
  138. while(in.ready() && read > 0 && (cl==-1 ||total < cl)) {
  139.     read=in.read(buf,0,8192);
  140.     if(read > 0) {
  141. total+=read;
  142. str.append(buf,0,read);
  143.     }
  144. }
  145.     } catch(Exception ex) {
  146. ex.printStackTrace();
  147.     }
  148.     if(total > 0) {
  149. http_header.setEncodedContent(str.toString(),req.getContentType());
  150.     }
  151.     if(req.getQueryString() != null) {
  152. http_header.setEncodedContent(req.getQueryString(),"application/x-www-form-urlencoded");
  153.     }
  154.     try {
  155. String url=http_header.getPath();
  156. try {
  157.     /* Find out about the session id */
  158.     sess=req.getSession(false)==null?null:(HTTPSession)req.getSession(false).getValue("webmail.session");
  159.     if(sess == null && url.startsWith("/login")) {
  160. sess=newSession(req,http_header);
  161.     } else if(sess == null && url.startsWith("/admin/login")) {
  162. http_header.setHeader("LOGIN","Administrator");
  163. sess=newAdminSession(req,http_header);
  164.     }
  165.     if(sess != null) sess.setEnv();
  166.     /* Let the URLHandler determine the document to use */
  167.     content=getURLHandler().handleURL(url,sess,http_header);
  168. } catch(InvalidPasswordException e) {
  169.     getStorage().log(Storage.LOG_ERR,"Connection to "+addr.toString()+
  170.      ": Authentication failed!");
  171.     if(url.startsWith("/admin/login")) {
  172. content=getURLHandler().handleURL("/admin",null,http_header);
  173.     } else if(url.startsWith("/login")) {
  174. // content=new HTMLLoginScreen(this,getStorage(),true);
  175. content=getURLHandler().handleURL("/",null,http_header);
  176.     } else {
  177. content=new HTMLErrorMessage(getStorage(),e.getMessage());
  178.     }
  179. } catch(InvalidDataException ex) {
  180.     content=new HTMLErrorMessage(getStorage(),ex.getMessage());
  181. }
  182. res.setDateHeader("Date:",System.currentTimeMillis());
  183. res.setDateHeader("Expires",System.currentTimeMillis()+300000);
  184. res.setHeader("Pragma","no-cache");
  185. res.setHeader("Cache-Control","must-revalidate");
  186. synchronized(out) {
  187.     //r=new HTTPResponseHeader(content.getReturnCode(),content.getReturnStatus());
  188.     res.setStatus(content.getReturnCode());
  189.     if(content.hasHTTPHeader()) {
  190. Enumeration enum=content.getHTTPHeaderKeys();
  191. while(enum.hasMoreElements()) {
  192.     String s=(String)enum.nextElement();
  193.     //r.putHeader(s,content.getHTTPHeader(s));
  194.     res.setHeader(s,content.getHTTPHeader(s));
  195. }
  196.     }
  197.     if(content instanceof HTMLImage) {
  198. HTMLImage img=(HTMLImage)content;
  199. res.setHeader("Content-Type",img.getContentType());
  200. res.setHeader("Content-Transfer-Encoding",img.getContentEncoding());
  201. res.setHeader("Content-Length",""+img.size());
  202. res.setHeader("Connection","Keep-Alive");
  203. BufferedOutputStream iout=new BufferedOutputStream(res.getOutputStream());
  204. /* Send 8k junks */
  205. int offset=0;
  206. while(offset + chunk_size < img.size()) {
  207.     iout.write(img.toBinary(),offset,chunk_size);
  208.     offset+=chunk_size;
  209. }
  210. iout.write(img.toBinary(),offset,img.size()-offset);
  211. iout.flush();
  212. out.flush();
  213. res.getOutputStream().close();
  214.     } else {
  215. res.setHeader("Content-Length",""+(content.length()+11));
  216. res.setHeader("Connection","Keep-Alive");
  217. res.setHeader("Content-Type","text/html");
  218. out.print(content+"rn");
  219. out.print("</HTML>rn");
  220. out.flush();
  221. out.close();
  222.     }
  223. }
  224.     } catch(DocumentNotFoundException e) {
  225. getStorage().log(Storage.LOG_INFO,"Connection to "+addr.toString()+
  226.  ": Could not handle request ("+err_code+") (Reason: "+e.getMessage()+")");
  227. res.setStatus(err_code);
  228. res.setHeader("Content-type","text/html");
  229. res.setHeader("Connection","close");
  230. content=new HTMLErrorMessage(getStorage(),e.getMessage());
  231. out.print(content+"rn");
  232. out.print("</HTML>rn");
  233. out.flush();
  234. out.close();
  235.     }
  236. } catch(Exception e) {
  237.     e.printStackTrace();
  238.     getStorage().log(Storage.LOG_INFO,"Connection to "+addr.toString()+" closed");
  239.     throw new ServletException("Error: "+e.getMessage());
  240. }
  241.     }
  242.     
  243.     /**
  244.      * Init possible servers of this main class
  245.      */
  246.     protected void initServers() {
  247.     }
  248.     protected void shutdownServers() {
  249.     }
  250.     public String getBasePath() {
  251. return basepath;
  252.     }
  253.     public String getImageBasePath() {
  254. return imgbase;
  255.     }
  256.     public WebMailSession newSession(HttpServletRequest req, HTTPRequestHeader h) throws InvalidPasswordException {
  257. HttpSession sess=req.getSession(true);
  258. if(sess.getValue("webmail.session") == null) {
  259.     WebMailSession n=new WebMailSession(this,req,h);
  260.     timer.addTimeableConnection(n);
  261.     n.login(h);
  262.     sess.putValue("webmail.session",n);
  263.     sessions.put(sess.getId(),n);
  264.     System.err.println("Created new Session: "+sess.getId());
  265.     return n;
  266. } else {
  267.     Object tmp=sess.getValue("webmail.session");
  268.     if(tmp instanceof WebMailSession) {
  269. WebMailSession n=(WebMailSession)tmp;
  270. n.login(h);
  271. System.err.println("Using old Session: "+sess.getId());
  272. return n;
  273.     } else {
  274. sess.putValue("webmail.session",null);
  275. System.err.println("Reusing old AdminSession: "+sess.getId());
  276. return newSession(req,h);
  277.     }
  278. }
  279.     }
  280.     public AdminSession newAdminSession(HttpServletRequest req, HTTPRequestHeader h) throws InvalidPasswordException {
  281. HttpSession sess=req.getSession(true);
  282. if(sess.getValue("webmail.session") == null) {
  283.     AdminSession n=new AdminSession(this,req,h);
  284.     timer.addTimeableConnection(n);
  285.     n.login(h);
  286.     sess.putValue("webmail.session",n);
  287.     sessions.put(sess.getId(),n);
  288.     System.err.println("Created new Session: "+sess.getId());
  289.     return n;
  290. } else {
  291.     Object tmp=sess.getValue("webmail.session");
  292.     if(tmp instanceof AdminSession) {
  293. AdminSession n=(AdminSession)tmp;
  294. n.login(h);
  295. System.err.println("Using old Session: "+sess.getId());
  296. return n;
  297.     } else {
  298. sess.putValue("webmail.session",null);
  299. System.err.println("Reusing old UserSession: "+sess.getId());
  300. return newAdminSession(req,h);
  301.     }
  302. }
  303.     }
  304.     public WebMailSession newSession(InetAddress a,HTTPRequestHeader h) throws InvalidPasswordException {
  305. System.err.println("newSession invalid call");
  306. return null;
  307.     }
  308.     public AdminSession newAdminSession(InetAddress a,HTTPRequestHeader h) throws InvalidPasswordException {
  309. System.err.println("newAdminSession invalid call");
  310. return null;
  311.     }
  312.     
  313.     public HTTPSession getSession(String sessionid, InetAddress a,HTTPRequestHeader h) throws InvalidPasswordException {
  314. System.err.println("getSession invalid call");
  315. return null;
  316.     }
  317.     public Enumeration getServers() {
  318. return new Enumeration() {
  319. public boolean hasMoreElements() {
  320.     return false;
  321. }
  322. public Object nextElement() {
  323.     return null;
  324. }
  325.     };
  326.     }
  327.     public String toString() {
  328. String s="";
  329. s+="Server: "+srvlt_config.getServletContext().getServerInfo()+"n";
  330. s+="Mount Point: "+getBasePath()+"n";
  331. s+=getServletInfo();
  332. return s;
  333.     }
  334.     public Object getServer(String ID) {
  335. return null;
  336.     }
  337.     public void reinitServer(String ID) {
  338.     }
  339.     public static String getVersion() {
  340. return "WebMail/Java Servlet v"+VERSION;
  341.     }
  342. } // WebMailServer