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

WEB邮件程序

开发平台:

C/C++

  1. package net.wastl.webmail.server;
  2. import net.wastl.webmail.xml.*;
  3. import net.wastl.webmail.misc.*;
  4. import net.wastl.webmail.config.*;
  5. import net.wastl.webmail.server.http.*;
  6. import java.net.*;
  7. import java.util.*;
  8. import javax.mail.*;
  9. import javax.servlet.http.*;
  10. import org.w3c.dom.*;
  11. /**
  12.  * AdminSession.java
  13.  *
  14.  * Created: Thu Sep  9 18:24:05 1999
  15.  *
  16.  * Copyright (C) 2000 Sebastian Schaffert
  17.  * 
  18.  * This program is free software; you can redistribute it and/or
  19.  * modify it under the terms of the GNU General Public License
  20.  * as published by the Free Software Foundation; either version 2
  21.  * of the License, or (at your option) any later version.
  22.  * 
  23.  * This program is distributed in the hope that it will be useful,
  24.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  25.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  26.  * GNU General Public License for more details.
  27.  * 
  28.  * You should have received a copy of the GNU General Public License
  29.  * along with this program; if not, write to the Free Software
  30.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  31.  */
  32. /**
  33.  *
  34.  * @author Sebastian Schaffert
  35.  * @version
  36.  */
  37. public class AdminSession implements HTTPSession {
  38.     
  39.     /** When has the session been last accessed? */
  40.     private long last_access;
  41.     /** The session-ID for this session */
  42.     private String session_code;
  43.     /** Parent WebMailServer */
  44.     protected WebMailServer parent;
  45.     protected InetAddress remote;
  46.     private String remote_agent;
  47.     private String remote_accepts;
  48.     protected XMLAdminModel model;
  49.     
  50.     protected HttpSession sess=null;
  51.     protected boolean running_as_servlet=false;
  52.     protected String selected_domain="";
  53.     protected String selected_user="";
  54.     protected boolean is_logged_out=false;
  55.     public AdminSession(WebMailServer parent, Object parm, HTTPRequestHeader h) throws InvalidPasswordException {
  56. try {
  57.     Class srvltreq=Class.forName("javax.servlet.http.HttpServletRequest");
  58.     if(srvltreq.isInstance(parm)) {
  59. running_as_servlet=true;
  60. javax.servlet.http.HttpServletRequest req=(javax.servlet.http.HttpServletRequest)parm;
  61. this.sess=req.getSession(false);
  62. session_code=((javax.servlet.http.HttpSession)sess).getId();
  63. try {
  64.     remote=InetAddress.getByName(req.getRemoteHost());
  65. } catch(UnknownHostException e) {
  66.     try {
  67. remote=InetAddress.getByName(req.getRemoteAddr());
  68.     } catch(Exception ex) {
  69. try {
  70.     remote=InetAddress.getByName("localhost");
  71. } catch(Exception ex2) {}
  72.     }
  73. }
  74.     } else {
  75. throw new Exception("Running as Servlet but not a valid ServletRequest");
  76.     }
  77. } catch(Throwable t) {
  78.     this.remote=(InetAddress)parm;
  79.     session_code=Helper.calcSessionCode(remote,h);
  80. }
  81. doInit(parent,h);
  82.     }
  83.     protected void doInit(WebMailServer parent, HTTPRequestHeader h) throws InvalidPasswordException {
  84. this.parent=parent;
  85. last_access=System.currentTimeMillis();
  86. remote_agent=h.getHeader("User-Agent").replace('n',' ');
  87. remote_accepts=h.getHeader("Accept").replace('n',' ');
  88. //env=new Hashtable();
  89. model=parent.getStorage().createXMLAdminModel();
  90. login(h);
  91. parent.getStorage().log(Storage.LOG_INFO,"WebMail: New Session ("+session_code+")");
  92. setEnv();
  93.     }
  94.     public void login(HTTPRequestHeader h) throws InvalidPasswordException {
  95. String passwd=parent.getStorage().getConfig("ADMIN PASSWORD");
  96. //  System.err.println("Crypted my password: "+passwd);
  97. //  System.err.println("Plain his password: "+h.getContent("password"));
  98. //  System.err.println("Crypted his password: "+Helper.crypt(passwd,h.getContent("password")));
  99. if(!Helper.crypt(passwd,h.getContent("password")).equals(passwd)) {
  100.     throw new InvalidPasswordException();
  101. }
  102. setLastAccess();
  103. setEnv();
  104. System.err.println("Ok");
  105.     }
  106.     public void logout() {
  107. if(!is_logged_out) {
  108.     if(sess!=null) {
  109.         try {
  110.   sess.invalidate();
  111. } catch(Exception ex) {}
  112.     }
  113.     if(parent.getSession(getSessionCode()) != null) {
  114. parent.removeSession(this);
  115.     }
  116. }
  117. is_logged_out=true;
  118.     }
  119.     public boolean isLoggedOut() {
  120. return is_logged_out;
  121.     }
  122.     public String getSessionCode() {
  123. return session_code;
  124.     }
  125.     public Locale getLocale() {
  126. return Locale.getDefault();
  127.     }
  128.     public long getLastAccess() {
  129. return last_access;
  130.     }
  131.     public void setLastAccess() {
  132. last_access=System.currentTimeMillis();
  133.     }
  134.     public String getEnv(String key) {
  135. return model.getStateVar(key);
  136.     }
  137.     public void selectUser(String user) {
  138. try {
  139.     selected_user=user;
  140.     System.err.println("Selecting user "+user);
  141.     XMLUserData ud=parent.getStorage().getUserData(user,selected_domain,"",false);
  142.     System.err.println("Done.");
  143.     model.importUserData(ud.getUserData());     
  144. } catch(InvalidPasswordException e) {}
  145.     }
  146.     public void clearUser() {
  147. selected_user="";
  148. model.clearUserData();
  149.     }
  150.     public void deleteUser(String user) {
  151. parent.getStorage().deleteUserData(user,selected_domain);
  152. // Refresh information
  153. selectDomain(selected_domain);
  154.     }
  155.     /**
  156.      * Change the settings for a specific user.
  157.      * This method will check for changes to a user's configuration and save the new user configuration.
  158.      * Note that this should not be done when a user session is still active!
  159.      * @param h Header parsed from AdministratorPlugin
  160.      */
  161.     public void changeUser(HTTPRequestHeader head) throws WebMailException {
  162. XMLUserData user=parent.getStorage().getUserData(selected_user,selected_domain,"",false);
  163. Enumeration contentkeys=head.getContentKeys();
  164. user.resetBoolVars();
  165. while(contentkeys.hasMoreElements()) {
  166.     String key=((String)contentkeys.nextElement()).toLowerCase();
  167.     if(key.startsWith("intvar")) {
  168. try {
  169.     long value=Long.parseLong(head.getContent(key));
  170.     user.setIntVar(key.substring(7),value);
  171. } catch(NumberFormatException ex) {
  172.     System.err.println("Warning: Remote provided illegal intvar in request header: n("+key+","+head.getContent(key)+")");
  173. }
  174.     } else if(key.startsWith("boolvar")) {
  175. boolean value=head.getContent(key).toUpperCase().equals("ON");
  176. user.setBoolVar(key.substring(8),value);
  177.     }
  178. }
  179. user.setSignature(head.getContent("user signature"));
  180. user.setFullName(head.getContent("user full name"));
  181. user.setEmail(head.getContent("user email"));
  182. if(!head.getContent("user password").equals("")) {
  183.     net.wastl.webmail.server.Authenticator auth=parent.getStorage().getAuthenticator();
  184.     if(auth.canChangePassword()) {
  185. auth.changePassword(user,head.getContent("user password"),head.getContent("user password"));
  186.     } else {
  187. throw new InvalidDataException(parent.getStorage().getStringResource("EX NO CHANGE PASSWORD",Locale.getDefault()));
  188.     }
  189. }
  190. user.setPreferredLocale(head.getContent("user language"));
  191.   parent.getStorage().saveUserData(selected_user,selected_domain);
  192. selectUser(selected_user);
  193. selectDomain(selected_domain);
  194.     }
  195.     public void selectDomain(String domain) {
  196. model.setStateVar("selected domain",domain);
  197. selected_domain=domain;
  198. Enumeration enum=parent.getStorage().getUsers(domain);
  199. model.removeAllStateVars("user");
  200. while(enum.hasMoreElements()) {
  201.     model.addStateVar("user",(String)enum.nextElement());
  202. }
  203.     }
  204.     public void setEnv(String key, String value) {
  205. //env.put(key,value);
  206. model.setStateVar(key,value);
  207.     }
  208.     public void setEnv() {
  209. model.setStateVar("session id",session_code);
  210. model.setStateVar("base uri",parent.getBasePath());
  211. model.setStateVar("img base uri",parent.getBasePath());
  212.   model.setStateVar("uptime",parent.getUptime()/1000+"");
  213. model.update();
  214. // Here we must initialize which choices are available for ChoiceConfigParameters!
  215. XMLSystemData sysdata=parent.getStorage().getSystemData();
  216. sysdata.initChoices();
  217. if(running_as_servlet) {
  218.     model.setStateVar("servlet status",parent.toString());
  219. } else {
  220.     model.setStateVar("http server status",parent.getHTTPServer().getStatus());
  221.     model.setStateVar("ssl server status",parent.getSSLServer().getStatus());
  222. }     
  223. model.setStateVar("storage status",parent.getStorage().toString());
  224. /*
  225.   Generate a list of active sessions with some additional information
  226.   (idle time, session code, active mail connections, ...)
  227. */
  228. XMLCommon.genericRemoveAll(model.getStateData(),"SESSION");
  229. Enumeration e=parent.getSessions();
  230. if(e != null && e.hasMoreElements()) {   
  231.     while(e.hasMoreElements()) {
  232. String name=(String)e.nextElement();
  233. HTTPSession h=parent.getSession(name);
  234. if(h instanceof WebMailSession) {
  235.     WebMailSession w=(WebMailSession)h;     
  236.     Element sess_elem=model.addStateElement("SESSION");
  237.     sess_elem.setAttribute("type","user");
  238.     
  239.     sess_elem.appendChild(model.createTextElement("SESS_USER",w.getUserName()));
  240.     sess_elem.appendChild(model.createTextElement("SESS_CODE",w.getSessionCode()));
  241.     sess_elem.appendChild(model.createTextElement("SESS_ADDRESS",w.getRemoteAddress().toString()));
  242.     sess_elem.appendChild(model.createStateVar("idle time",(System.currentTimeMillis()-w.getLastAccess())/1000+""));
  243.     
  244.     Enumeration keys=w.getActiveConnections().keys();
  245.     while(keys.hasMoreElements()) {
  246. String next=(String)keys.nextElement();
  247. try {
  248.     sess_elem.appendChild(model.createTextElement("SESS_CONN",((Folder)w.getActiveConnections().get(next)).getURLName()+""));
  249. } catch(Exception ex) {
  250.     sess_elem.appendChild(model.createTextElement("SESS_CONN","Error while fetching connection "+next));
  251. }
  252.     }
  253.     /* If the remote is admin and we are not the remote! */
  254.     // && !h.getSessionCode().equals(session_code)
  255. } else if(h instanceof AdminSession) {
  256.     Element sess_elem=model.addStateElement("SESSION");
  257.     sess_elem.setAttribute("type","admin");
  258.     sess_elem.appendChild(model.createTextElement("SESS_USER","Administrator"));
  259.     sess_elem.appendChild(model.createTextElement("SESS_ADDRESS",h.getRemoteAddress().toString()));
  260.     sess_elem.appendChild(model.createTextElement("SESS_CODE",h.getSessionCode()));
  261.     sess_elem.appendChild(model.createStateVar("idle time",(System.currentTimeMillis()-h.getLastAccess())/1000+""));
  262. }
  263.     }
  264. }
  265. // Add all languages to the state
  266. model.removeAllStateVars("language");
  267. String lang=parent.getConfig("languages");
  268. StringTokenizer tok=new StringTokenizer(lang," ");
  269. while(tok.hasMoreTokens()) {
  270.     String t=tok.nextToken();
  271.     model.addStateVar("language",t);
  272. }
  273. model.removeAllStateVars("protocol");
  274. Provider[] stores=parent.getStoreProviders();
  275. for(int i=0; i<stores.length; i++) {
  276.     model.addStateVar("protocol",stores[i].getProtocol());
  277. }
  278.     }
  279.     public InetAddress getRemoteAddress() {
  280. return remote;
  281.     }
  282.     public long getTimeout() {
  283. return 600000;
  284.     }
  285.     public void timeoutOccured() {
  286.     }
  287.     public void saveData() {
  288.     }
  289.     public Document getModel() {
  290. return model.getRoot();
  291.     }
  292. } // AdminSession