📄 webmailsession.java
字号:
/* CVS ID: $Id: WebMailSession.java,v 1.14 2001/03/26 17:08:11 wastl Exp $ */package net.wastl.webmail.server;import java.net.*;import java.io.*;import java.util.*;import java.text.*;import javax.mail.*;import javax.mail.event.*;import javax.mail.internet.*;import net.wastl.webmail.misc.*;import net.wastl.webmail.xml.*;// No longer used://import net.wastl.webmail.ui.html.JavaScriptFilter;//import net.wastl.webmail.ui.html.HTMLifier;import net.wastl.webmail.ui.html.Fancyfier;import net.wastl.webmail.server.http.HTTPRequestHeader;import net.wastl.webmail.exceptions.*;// Modified by exce, startimport org.bulbul.webmail.util.TranscodeUtil;// Modified by exce, endimport org.w3c.tidy.Tidy;import org.w3c.dom.*;/* * WebMailSession.java * * Created: Thu Feb 4 12:59:30 1999 * * Copyright (C) 1999-2001 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. *//** * A user session for WebMail. * Contains the state of the actual user (loads it from disk). * Has a unique session-ID. * * * @author Sebastian Schaffert * @version $Revision: 1.14 $ *//* 9/24/2000 devink - updated for challenge/response auth */public class WebMailSession implements HTTPSession { /** When has the session been last accessed? */ private long last_access; /** The session-ID for this session */ private String session_code; /** Parent WebMailServer */ private WebMailServer parent; /** State of the current users configuration */ private XMLUserData user; private XMLUserModel model; /** Connections to Mailboxes */ private Hashtable connections; /** Connections to hosts */ private Hashtable stores; /** javax.mail Mailsession */ private Session mailsession; private InetAddress remote; /* Files attached to messages will be stored here. We will have to take care of possible memory problems! */ private Hashtable mime_parts_decoded; private boolean sent; private String remote_agent; private String remote_accepts; private int attachments_size=0; private String last_login; /** Save the login password. It will be used for the second try password if * opening a folder fails. */ private String login_password; private Object sess=null; private Hashtable folders; protected Vector need_expunge_folders; protected boolean is_logged_out=false; public WebMailSession(WebMailServer parent,Object parm,HTTPRequestHeader h) throws UserDataException, InvalidPasswordException { try { Class srvltreq=Class.forName("javax.servlet.http.HttpServletRequest"); if(srvltreq.isInstance(parm)) { javax.servlet.http.HttpServletRequest req=(javax.servlet.http.HttpServletRequest)parm; this.sess=req.getSession(false); session_code=((javax.servlet.http.HttpSession)sess).getId(); try { remote=InetAddress.getByName(req.getRemoteHost()); } catch(UnknownHostException e) { try { remote=InetAddress.getByName(req.getRemoteAddr()); } catch(Exception ex) { try { remote=InetAddress.getByName("localhost"); } catch(Exception ex2) {} } } } else { throw new Exception("Servlet class found but not running as servlet"); } } catch(Throwable t) { this.remote=(InetAddress)parm; session_code=Helper.calcSessionCode(remote,h); } doInit(parent,h); } /** * This method does the actual initialisation * * devink 7/15/2000 - added TwoPassAuthenticationException * - updated call to getUserData(), to use my new one. * devink 9/24/2000 - reverted back to old getUserData call */ protected void doInit(WebMailServer parent, HTTPRequestHeader h) throws UserDataException, InvalidPasswordException { setLastAccess(); this.parent=parent; remote_agent=h.getHeader("User-Agent").replace('\n',' '); remote_accepts=h.getHeader("Accept").replace('\n',' '); parent.getStorage().log(Storage.LOG_INFO,"WebMail: New Session ("+session_code+")"); user=WebMailServer.getStorage().getUserData(h.getContent("login"),h.getContent("vdom"),h.getContent("password"),true); last_login=user.getLastLogin(); user.login(); login_password=h.getContent("password"); model=parent.getStorage().createXMLUserModel(user); connections=new Hashtable(); stores=new Hashtable(); folders=new Hashtable(); mailsession=Session.getDefaultInstance(System.getProperties(),null); /* If the user logs in for the first time we want all folders subscribed */ if(user.getLoginCount().equals("1")) { Enumeration enum=user.mailHosts(); while(enum.hasMoreElements()) { String id=(String)enum.nextElement(); if(user.getMailHost(id).getName().equals("Default")) { try { setSubscribedAll(id,true); } catch(MessagingException ex) { ex.printStackTrace(); } break; } } } setEnv(); } public XMLUserModel getUserModel() { return model; } public Document getModel() { return model.getRoot(); } /** * Calculate session-ID for a session. * * @param a Adress of the remote host * @param h Requestheader of the remote user agent * @returns Session-ID */ public String calcCode(InetAddress a, HTTPRequestHeader h) { if(sess==null) { return Helper.calcSessionCode(a,h); } else { try { Class srvltreq=Class.forName("javax.servlet.http.HttpSession"); if(srvltreq.isInstance(sess)) { return ((javax.servlet.http.HttpSession)sess).getId(); } else { return "error"; } } catch(Throwable t) { return "error"; } } } /** * Login to this session. * Establishes connections to a user磗 Mailhosts * * @param h RequestHeader with content from Login-POST operation. * @deprecated Use login() instead, no need for parameters and exception handling */ public void login(HTTPRequestHeader h) throws InvalidPasswordException { //user.login(h.getContent("password")); login(); } /** * Login this session. * * Updates access time, sets initial environment and connects all configured mailboxes. */ public void login() { setLastAccess(); setEnv(); connectAll(); } /** * Return a locale-specific string resource */ public String getStringResource(String key) { return parent.getStorage().getStringResource(key,user.getPreferredLocale()); } /** * Create a Message List. * Fetches a list of headers in folder foldername for part list_part. * The messagelist will be stored in the "MESSAGES" environment. * * @param foldername folder for which a message list should be built * @param list_part part of list to display (1 = last xx messages, 2 = total-2*xx - total-xx messages) */ public void createMessageList(String folderhash,int list_part) throws NoSuchFolderException { long time_start=System.currentTimeMillis(); TimeZone tz=TimeZone.getDefault(); DateFormat df=DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.SHORT, user.getPreferredLocale()); df.setTimeZone(tz); try { Folder folder=getFolder(folderhash); Element xml_folder=model.getFolder(folderhash); Element xml_current=model.setCurrentFolder(folderhash); Element xml_messagelist=model.getMessageList(xml_folder); if(folder == null) { throw new NoSuchFolderException(folderhash); } long fetch_start=System.currentTimeMillis(); if(!folder.isOpen()) { folder.open(Folder.READ_ONLY); } else { folder.close(false); folder.open(Folder.READ_ONLY); } /* Calculate first and last message to show */ int total_messages=folder.getMessageCount(); int new_messages=folder.getNewMessageCount(); int show_msgs=user.getMaxShowMessages(); xml_messagelist.setAttribute("total",total_messages+""); xml_messagelist.setAttribute("new",new_messages+"");// System.err.println("Total: "+total_messages); /* Handle small messagelists correctly */ if(total_messages < show_msgs) { show_msgs = total_messages; } /* Don't accept list-parts smaller than 1 */ if(list_part < 1) { list_part=1; } for(int k=0;k<list_part;k++) { total_messages-=show_msgs; } /* Handle beginning of message list */ if(total_messages<0) { total_messages=0; } int first=total_messages+1; int last=total_messages+show_msgs; /* Set environment variable */ setEnv(); xml_current.setAttribute("first_msg",first+""); xml_current.setAttribute("last_msg",last+""); xml_current.setAttribute("list_part",list_part+""); /* Fetch headers */ FetchProfile fp=new FetchProfile(); fp.add(FetchProfile.Item.ENVELOPE); fp.add(FetchProfile.Item.FLAGS); fp.add(FetchProfile.Item.CONTENT_INFO);// System.err.println("Last: "+last+", first: "+first); Message[] msgs=folder.getMessages(first,last); //System.err.println(msgs.length + " messages fetching..."); folder.fetch(msgs,fp); long fetch_stop=System.currentTimeMillis(); Hashtable header=new Hashtable(15); Flags.Flag[] sf; String from,to,cc,bcc,replyto,subject; String messageid; for(int i=msgs.length-1; i>=0; i--) {// if(((MimeMessage)msgs[i]).getMessageID() == null) {// folder.close(false);// folder.open(Folder.READ_WRITE);// ((MimeMessage)msgs[i]).setHeader("Message-ID","<"+user.getLogin()+"."+System.currentTimeMillis()+".jwebmail@"+user.getDomain()+">");// ((MimeMessage)msgs[i]).saveChanges();// folder.close(false);// folder.open(Folder.READ_ONLY);// } try { StringTokenizer tok=new StringTokenizer(((MimeMessage)msgs[i]).getMessageID(),"<>"); messageid=tok.nextToken(); } catch(NullPointerException ex) { // For mail servers that don't generate a Message-ID (Outlook et al) messageid=user.getLogin()+"."+i+".jwebmail@"+user.getDomain(); } XMLMessage xml_message=model.getMessage(xml_folder,msgs[i].getMessageNumber()+"", messageid); /* Addresses */ from="";replyto="";to="";cc="";bcc=""; try { from=MimeUtility.decodeText(Helper.joinAddress(msgs[i].getFrom())); replyto=MimeUtility.decodeText(Helper.joinAddress(msgs[i].getReplyTo())); to=MimeUtility.decodeText(Helper.joinAddress(msgs[i].getRecipients(Message.RecipientType.TO))); cc=MimeUtility.decodeText(Helper.joinAddress(msgs[i].getRecipients(Message.RecipientType.CC))); bcc=MimeUtility.decodeText(Helper.joinAddress(msgs[i].getRecipients(Message.RecipientType.BCC))); } catch(UnsupportedEncodingException e) { parent.getStorage().log(Storage.LOG_WARN,"Unsupported Encoding: "+e.getMessage()); } if(from=="") from=getStringResource("unknown sender"); if(to == "") to = getStringResource("unknown recipient"); /* Flags */ sf = msgs[i].getFlags().getSystemFlags(); String basepath=parent.getBasePath(); for(int j=0;j<sf.length;j++) { if(sf[j]==Flags.Flag.RECENT) xml_message.setAttribute("recent","true"); if(sf[j]==Flags.Flag.SEEN) xml_message.setAttribute("seen","true"); if(sf[j]==Flags.Flag.DELETED) xml_message.setAttribute("deleted","true"); if(sf[j]==Flags.Flag.ANSWERED) xml_message.setAttribute("answered","true"); if(sf[j]==Flags.Flag.DRAFT) xml_message.setAttribute("draft","true"); if(sf[j]==Flags.Flag.FLAGGED) xml_message.setAttribute("flagged","true"); if(sf[j]==Flags.Flag.USER) xml_message.setAttribute("user","true"); } if(msgs[i] instanceof MimeMessage && ((MimeMessage) msgs[i]).getContentType().toUpperCase().startsWith("MULTIPART/")) { xml_message.setAttribute("attachment","true"); } if(msgs[i] instanceof MimeMessage) { int size=((MimeMessage) msgs[i]).getSize(); size/=1024; xml_message.setAttribute("size",(size>0?size+"":"<1")+" kB"); } /* Subject */ subject=""; if(msgs[i].getSubject() != null) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -