📄 webmailsession.java
字号:
} protected Store connectStore(String host,String protocol,String login, String password) throws MessagingException { /* Check whether the domain of this user allows to connect to the host */ WebMailVirtualDomain vdom=parent.getStorage().getVirtualDomain(user.getDomain()); if(!vdom.isAllowedHost(host)) { throw new MessagingException("You are not allowed to connect to this host"); } /* Check if this host is already connected. Use connection if true, create a new one if false. */ Store st=(Store)stores.get(host+"-"+protocol); if(st==null) { st=mailsession.getStore(protocol); stores.put(host+"-"+protocol,st); } /* Maybe this is a new store or this store has been disconnected. Reconnect if this is the case. */ if(!st.isConnected()) { try { st.connect(host,login,password); parent.getStorage().log(Storage.LOG_INFO,"Mail: Connection to "+st.toString()+"."); } catch(AuthenticationFailedException ex) { /* If login fails, try the login_password */ if(!login_password.equals(password) && parent.getStorage().getConfig("FOLDER TRY LOGIN PASSWORD").toUpperCase().equals("YES")) { st.connect(host,login,login_password); parent.getStorage().log(Storage.LOG_INFO,"Mail: Connection to "+st.toString()+", second attempt with login password succeeded."); } else { throw ex; } } } return st; } /** Connect to mailhost "name" */ public Folder connect(String name) throws MessagingException { MailHostData m=user.getMailHost(name); URLName url=new URLName(m.getHostURL()); Store st=connectStore(url.getHost(),url.getProtocol(),m.getLogin(),m.getPassword()); //System.err.println("Default folder: "+st.getDefaultFolder().toString()); Folder f=st.getDefaultFolder(); connections.put(name,f); parent.getStorage().log(Storage.LOG_INFO,"Mail: Folder "+f.toString()+" opened at store "+st.toString()+"."); return f; } /** Disconnect from mailhost "name" */ public void disconnect(String name) { try { Folder f=(Folder)connections.get(name); if(f != null && f.isOpen()) { f.close(true); Store st=((Folder)connections.get(name)).getStore(); //st.close(); parent.getStorage().log(Storage.LOG_INFO,"Mail: Disconnected from folder "+f.toString()+" at store "+st.toString()+"."); } else { parent.getStorage().log(Storage.LOG_WARN,"Mail: Folder "+name+" was null???."); } } catch(MessagingException ex) { // Should not happen ex.printStackTrace(); } catch(NullPointerException ex) { // This happens when deleting a folder with an error ex.printStackTrace(); } finally { connections.remove(name); } } /** * Terminate this session. * * This will expunge deleted messages, close all mailbox connections, save the user data and then * remove this session from the session list, effectively destroying this session. */ public void logout() { if(!is_logged_out) { is_logged_out=true; expungeFolders(); disconnectAll(); user.logout(); saveData(); parent.getStorage().log(Storage.LOG_INFO,"WebMail: Session "+getSessionCode()+" logout."); // Make sure the session is invalidated if(sess != null) { try { Class srvltreq=Class.forName("javax.servlet.http.HttpSession"); if(srvltreq.isInstance(sess)) { ((javax.servlet.http.HttpSession)sess).invalidate(); } } catch(Throwable t) { } } if(parent.getSession(getSessionCode()) != null) { parent.removeSession(this); } } else { System.err.println("WARNING: Session was already logged out. Ignoring logout request."); } } /** * Check whether this session is already logged out. * Useful to avoid loops. */ public boolean isLoggedOut() { return is_logged_out; } /** * Return the session id that was generated for this session. */ public String getSessionCode() { return session_code; } /** * Return the last access time of this session * * @see TimeableConnection */ public long getLastAccess() { return last_access; } /** * Update the last access time. * Sets the last access time to the current time. * * @see TimeableConnection */ public void setLastAccess() { last_access=System.currentTimeMillis(); //System.err.println("Setting last access to session: "+last_access); } /** * Handle a timeout for this session. * This calls the logout method, effectively terminating this session. * * @see TimeableConnection * @see logout() */ public void timeoutOccured() { parent.getStorage().log(Storage.LOG_WARN,"WebMail: Session "+getSessionCode()+" timeout."); logout(); } public long getTimeout() { long i=600000; try { i=Long.parseLong(parent.getStorage().getConfig("session timeout")); } catch(NumberFormatException ex) { ex.printStackTrace(); } return i; } public Locale getLocale() { return user.getPreferredLocale(); } public void saveData() { parent.getStorage().saveUserData(user.getUserName(),user.getDomain()); } protected static int[] getSelectedMessages(HTTPRequestHeader head, int max) { // System.err.print(" - select messages..."); Enumeration e=head.getContent().keys(); int _msgs[]=new int[max]; int j=0; while(e.hasMoreElements()) { String s=(String)e.nextElement(); if(s.startsWith("CH") && head.getContent(s).equals("on")) { try { _msgs[j]=Integer.parseInt(s.substring(3)); // System.err.print(_msgs[j]+" "); j++; } catch(NumberFormatException ex) { ex.printStackTrace(); } } } //System.err.println(); int msgs[]=new int[j]; for(int i=0;i<j;i++) { msgs[i]=_msgs[i]; } return msgs; } /** * Expunge all folders that have messages waiting to be deleted */ public void expungeFolders() { if(need_expunge_folders != null) { Enumeration enum=need_expunge_folders.elements(); while(enum.hasMoreElements()) { String hash=(String)enum.nextElement(); if(user.wantsSetFlags()) { Folder f=getFolder(hash); try { if(f.isOpen()) { f.close(false); } f.open(Folder.READ_WRITE); // POP3 doesn't support expunge! try { f.expunge(); } catch(MessagingException ex) {} f.close(true); } catch(MessagingException ex) { // XXXX ex.printStackTrace(); } } } } } /** Change the Flags of the messages the user selected. */ public void setFlags(String folderhash, HTTPRequestHeader head) throws MessagingException { if(head.isContentSet("copymovemsgs") && head.getContent("COPYMOVE").equals("COPY")) { copyMoveMessage(folderhash,head.getContent("TO"),head,false); } else if(head.isContentSet("copymovemsgs") && head.getContent("COPYMOVE").equals("MOVE")) { copyMoveMessage(folderhash,head.getContent("TO"),head,true); } else if(head.isContentSet("flagmsgs")) { System.err.println("setting message flags"); Folder folder=getFolder(folderhash); //System.err.println("Processing Request Header..."); /* Get selected messages */ int msgs[]=getSelectedMessages(head,folder.getMessageCount()); //System.err.println(" - get flags..."); /* Get selected flags */ Flags fl=new Flags(Flags.Flag.USER); if(head.getContent("MESSAGE FLAG").equals("DELETED")) { fl=new Flags(Flags.Flag.DELETED); if(need_expunge_folders == null) { need_expunge_folders=new Vector(); } need_expunge_folders.addElement(folderhash); } else if(head.getContent("MESSAGE FLAG").equals("SEEN")) { fl=new Flags(Flags.Flag.SEEN); } else if(head.getContent("MESSAGE FLAG").equals("RECENT")) { fl=new Flags(Flags.Flag.RECENT); } else if(head.getContent("MESSAGE FLAG").equals("ANSWERED")) { fl=new Flags(Flags.Flag.ANSWERED); } else if(head.getContent("MESSAGE FLAG").equals("DRAFT")) { fl=new Flags(Flags.Flag.DRAFT); } boolean value=true; if(head.getContent("MARK").equals("UNMARK")) { value=false; } //System.err.println("Done!"); //System.err.println("Setting flags..."); if(user.wantsSetFlags()) { if(folder.isOpen() && folder.getMode()==Folder.READ_ONLY) { folder.close(false); folder.open(Folder.READ_WRITE); } else if(!folder.isOpen()) { folder.open(Folder.READ_WRITE); } folder.setFlags(msgs,fl,value); if(user.getBoolVar("autoexpunge")) { folder.close(true); if(need_expunge_folders != null) { need_expunge_folders.removeElement(folderhash); } } else { folder.close(false); } } refreshFolderInformation(folderhash); } } /** * Copy or move the selected messages from folder fromfolder to folder tofolder. */ public void copyMoveMessage(String fromfolder, String tofolder, HTTPRequestHeader head, boolean move) throws MessagingException { Folder from=getFolder(fromfolder); Folder to=getFolder(tofolder); if(user.wantsSetFlags()) { if(from.isOpen() && from.getMode() == Folder.READ_ONLY) { from.close(false); from.open(Folder.READ_WRITE); } else if(!from.isOpen()) { from.open(Folder.READ_WRITE); } if(to.isOpen() && to.getMode() == Folder.READ_ONLY) { to.close(false); to.open(Folder.READ_WRITE); } else if(!to.isOpen()) { to.open(Folder.READ_WRITE); } } else { if(!from.isOpen()) { from.open(Folder.READ_ONLY); } if(to.isOpen() && to.getMode() == Folder.READ_ONLY) { to.close(false); to.open(Folder.READ_WRITE); } else if(!to.isOpen()) { to.open(Folder.READ_WRITE); } } int m[]=getSelectedMessages(head,from.getMessageCount()); Message msgs[]=from.getMessages(m); from.copyMessages(msgs,to); if(move && user.wantsSetFlags()) { from.setFlags(m,new Flags(Flags.Flag.DELETED),true); if(user.getBoolVar("autoexpunge")) { from.close(true); to.close(true); } else { if(need_expunge_folders == null) { need_expunge_folders=new Vector(); } need_expunge_folders.addElement(fromfolder); from.close(false); to.close(false); } } else { from.close(false); if(user.getBoolVar("autoexpunge")) { to.close(true); } else { to.close(false); } } refreshFolderInformation(fromfolder); refreshFolderInformation(tofolder); } /** * Change a user's configuration. * Header fields given in the requestheader are parsed and turned into user options (probably should not be in WebMailSession * but in a plugin or something; this is very hacky). */ public void changeSetup(HTTPRequestHeader head) throws WebMailException { Enumeration contentkeys=head.getContentKeys(); user.resetBoolVars(); while(contentkeys.hasMoreElements()) { String key=((String)contentkeys.nextElement()).toLowerCase(); if(key.startsWith("intvar")) { try { long value=Long.parseLong(head.getContent(key)); user.setIntVar(key.substring(7),value); } catch(NumberFormatException ex) { System.err.println("Warning: Remote provided illegal intvar in request header: \n("+key+","+head.getContent(key)+")"); } } else if(key.startsWith("boolvar")) { boolean value=head.getContent(key).toUpperCase().equals("ON"); user.setBoolVar(key.substring(8),value); } } // Modified by exce, start /** * As described in line #1088, we have to transcode these strings. * We only allow SIGNATURE and FULLNAM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -