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

WEB邮件程序

开发平台:

C/C++

  1. /* CVS ID: $Id: SimpleStorage.java,v 1.5 2000/04/06 08:02:02 wastl Exp $ */
  2. package net.wastl.webmail.storage.simple;
  3. import java.io.*;
  4. import java.text.*;
  5. import java.util.*;
  6. import java.util.zip.*;
  7. import net.wastl.webmail.storage.*;
  8. import net.wastl.webmail.server.*;
  9. import net.wastl.webmail.config.*;
  10. import net.wastl.webmail.misc.*;
  11. import net.wastl.webmail.xml.*;
  12. import org.apache.xerces.parsers.*;
  13. import org.apache.xml.serialize.*;
  14. import org.w3c.dom.*;
  15. /**
  16.  * SimpleStorage.java
  17.  *
  18.  * Created:  Feb 1999
  19.  *
  20.  * Copyright (C) 1999-2000 Sebastian Schaffert
  21.  * 
  22.  * This program is free software; you can redistribute it and/or
  23.  * modify it under the terms of the GNU General Public License
  24.  * as published by the Free Software Foundation; either version 2
  25.  * of the License, or (at your option) any later version.
  26.  * 
  27.  * This program is distributed in the hope that it will be useful,
  28.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  29.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  30.  * GNU General Public License for more details.
  31.  * 
  32.  * You should have received a copy of the GNU General Public License
  33.  * along with this program; if not, write to the Free Software
  34.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  35.  */
  36. /** 
  37.  * This is the SimpleStorage class for the non-enterprise edition of WebMail. 
  38.  * It provides means of getting and storing data in ZIPFiles and ResourceBundles.
  39.  *
  40.  * @see Storage
  41.  * @author Sebastian Schaffert
  42.  * @versin $Revision: 1.5 $
  43.  */
  44. public class SimpleStorage extends FileStorage {
  45.     protected Hashtable resources;
  46.     protected Hashtable vdoms;
  47.     
  48.     protected ExpireableCache user_cache;
  49.     
  50.     protected int user_cache_size=100;
  51.     /**
  52.      * Initialize SimpleStorage.
  53.      * Fetch Configuration Information etc.
  54.      */
  55.     public SimpleStorage(WebMailServer parent) {
  56. super(parent);
  57. saveXMLSysData();
  58.     }
  59.     protected void initConfig() {
  60. System.err.print("  * Configuration ... ");
  61. loadXMLSysData();
  62. System.err.println("successfully parsed XML configuration file.");
  63.     }
  64.     protected void loadXMLSysData() {
  65. String datapath=parent.getProperty("webmail.data.path");
  66. String file=datapath+System.getProperty("file.separator")+"webmail.xml";
  67. DOMParser parser = new DOMParser();
  68.         try {
  69.             parser.parse(file);
  70.         } catch(Exception ex) {
  71.     System.err.println("Error parsing WebMail configuration file!");
  72.             ex.printStackTrace();
  73.             System.exit(0);
  74.         }
  75. log(Storage.LOG_DEBUG, "SimpleStorage: WebMail configuration loaded.");
  76. if(debug) System.err.println("nConfiguration file parsed, document: "+parser.getDocument());
  77. sysdata=new XMLSystemData(parser.getDocument(),cs);
  78.     }
  79.     protected void saveXMLSysData() {
  80. try {
  81.     Document d=sysdata.getRoot();
  82.     OutputStream cfg_out=new FileOutputStream(parent.getProperty("webmail.data.path")+
  83.       System.getProperty("file.separator")+
  84.       "webmail.xml");
  85.     XMLCommon.writeXML(d,cfg_out,parent.getProperty("webmail.xml.path")+
  86.        System.getProperty("file.separator")+"sysdata.dtd");
  87.     cfg_out.flush();
  88.     cfg_out.close();
  89.     sysdata.setLoadTime(System.currentTimeMillis());
  90.     log(Storage.LOG_DEBUG, "SimpleStorage: WebMail configuration saved.");
  91. } catch(Exception ex) {
  92.     log(Storage.LOG_ERR,"SimpleStorage: Error while trying to save WebMail configuration ("+ex.getMessage()+").");
  93.     ex.printStackTrace();
  94. }
  95.     }
  96.     protected void initCache() {
  97. // Initialize the file cache from FileStorage
  98. super.initCache();
  99. // Now initialize the user cache
  100. cs.configRegisterIntegerKey(this,"CACHE SIZE USER","100","Size of the user cache");
  101. try {
  102.     // Default value 100, if parsing fails.
  103.     user_cache_size=100;
  104.     user_cache_size=Integer.parseInt("CACHE SIZE USER");
  105. } catch(NumberFormatException e) {}
  106. if(user_cache==null) {
  107.     user_cache=new ExpireableCache(user_cache_size);
  108. } else {
  109.     user_cache.setCapacity(user_cache_size);
  110. }
  111.     }
  112.      
  113.     public Enumeration getUsers(String domain) {
  114. String path=parent.getProperty("webmail.data.path")+System.getProperty("file.separator")+
  115.     domain+System.getProperty("file.separator");
  116. File f=new File(path);
  117. if(f.canRead() && f.isDirectory()) {
  118.     final String[] files=f.list(new FilenameFilter() {
  119.     public boolean accept(File file, String s) {
  120. if(s.endsWith(".xml")) {
  121.     return true;
  122. } else {
  123.     return false;
  124. }
  125.     }
  126. } );
  127.     return new Enumeration() {
  128.     int i=0;
  129.     public boolean hasMoreElements() {
  130. return i<files.length;
  131.     }
  132.     public Object nextElement() {
  133. int cur=i++;
  134. return files[cur].substring(0,files[cur].length()-4);
  135.     }
  136. };
  137. } else {
  138.     log(Storage.LOG_WARN,"SimpleStorage: Could not list files in directory "+path);
  139.     return new Enumeration() {
  140.     public boolean hasMoreElements() { return false; }
  141.     public Object nextElement() { return null; }
  142. };
  143. }
  144.     }
  145.     public XMLUserData getUserData(String user, String domain, String password, boolean authenticate) 
  146. throws InvalidPasswordException {
  147. if(authenticate) {
  148.     auth.authenticatePreUserData(user,domain,password);
  149. }
  150. if(user.equals("")) {
  151.     return null;
  152. }
  153. XMLUserData data=(XMLUserData)user_cache.get(user+"@"+domain);
  154. if(data == null) {
  155.     user_cache.miss();
  156.     String filename=parent.getProperty("webmail.data.path")+
  157. System.getProperty("file.separator")+domain+
  158. System.getProperty("file.separator")+user+".xml";
  159.     boolean error=true;
  160.     File f=new File(filename);
  161.     if(f.exists() && f.canRead()) {
  162. log(Storage.LOG_INFO,"SimpleStorage: Reading user configuration ("+f.getAbsolutePath()+") for "+user);
  163.     
  164. long t_start=System.currentTimeMillis();
  165. DOMParser parser = new DOMParser();
  166. try {
  167.     parser.parse(f.getAbsolutePath());
  168.     data=new XMLUserData(parser.getDocument());
  169.     if(debug) System.err.println("SimpleStorage: Parsed Document "+parser.getDocument());
  170.     error=false;
  171. } catch(Exception ex) {
  172.     log(Storage.LOG_WARN,"SimpleStorage: User configuration for "+user+
  173. " exists but could not be parsed ("+ex.getMessage()+")");
  174.     if(debug) ex.printStackTrace();
  175.     error=true;
  176. }
  177. long t_end=System.currentTimeMillis();
  178. log(Storage.LOG_DEBUG,"SimpleStorage: Parsing of XML userdata for "+user+", domain "
  179.     +domain+" took "+(t_end-t_start)+"ms.");
  180. if(authenticate) {
  181.     auth.authenticatePostUserData(data,domain,password);
  182. }
  183.     } 
  184.     if(error && !f.exists()) {
  185. log(Storage.LOG_INFO,"UserConfig: Creating user configuration for "+user);
  186. String template=parent.getProperty("webmail.xml.path")+
  187.     System.getProperty("file.separator")+"userdata.xml";
  188. DOMParser parser = new DOMParser();
  189. try {
  190.     parser.parse(template);
  191.     data=new XMLUserData(parser.getDocument());
  192.     data.init(user,domain,password);
  193.     data.setSignature(user+"@"+domain+"nn"+
  194.       "JWebMail "+parent.getVersion()+" WWW <-> Mail Gateway");
  195.     WebMailVirtualDomain vdom=getVirtualDomain(domain);
  196.     data.addMailHost("Default",getConfig("DEFAULT PROTOCOL")+"://"+
  197.      user+"@"+vdom.getDefaultServer(),user,password);
  198.     
  199.     error=false;
  200. } catch(Exception ex) {
  201.     log(Storage.LOG_WARN,"SimpleStorage: User configuration template ("+template+") exists but could not be parsed");
  202.     if(debug) ex.printStackTrace();
  203.     error=true;
  204. }
  205. if(authenticate) {
  206.     auth.authenticatePostUserData(data,domain,password);
  207. }
  208.     } 
  209.     if(error) {
  210. log(Storage.LOG_ERR,"UserConfig: Could not read userdata for "+user+"!");
  211. throw new InvalidPasswordException("Could not read userdata for "+user+"!");
  212.     }
  213.     user_cache.put(user+"@"+domain,data);
  214. } else {
  215.     //data=(SimpleUserData)user_cache.get(user);
  216.     user_cache.hit();
  217.     if(authenticate) {
  218. auth.authenticatePostUserData(data,domain,password);
  219.     }
  220. }
  221. //if(debug) XMLCommon.debugXML(data.getRoot());
  222. return data;
  223.     }
  224.     public void saveUserData(String user, String domain) {
  225. try {
  226.    
  227.     String path=parent.getProperty("webmail.data.path")+
  228. System.getProperty("file.separator")+domain;
  229.     File p=new File(path);
  230.     if((p.exists() && p.isDirectory()) || p.mkdirs()) {
  231. File f=new File(path+System.getProperty("file.separator")+user+".xml");
  232. if((!f.exists() && p.canWrite()) || f.canWrite()) {
  233.     XMLUserData userdata=getUserData(user,domain,"",false);
  234.     Document d=userdata.getRoot();
  235.     long t_start=System.currentTimeMillis();
  236.     FileOutputStream out=new FileOutputStream(f);
  237.     XMLCommon.writeXML(d,out,parent.getProperty("webmail.xml.path")+
  238.        System.getProperty("file.separator")+"userdata.dtd");
  239.     out.flush();
  240.     out.close();   
  241.     long t_end=System.currentTimeMillis();
  242.     log(Storage.LOG_DEBUG,"SimpleStorage: Serializing userdata for "+user+
  243. ", domain "+domain+" took "+(t_end-t_start)+"ms.");
  244. } else {
  245.     log(Storage.LOG_WARN,"SimpleStorage: Could not write userdata ("+f.getAbsolutePath()+") for user "+user);
  246. }
  247.     } else {
  248. log(Storage.LOG_ERR,"SimpleStorage: Could not create path "+path+
  249.     ". Aborting with user "+user);
  250.     }
  251. } catch(Exception ex) {
  252.     log(Storage.LOG_ERR,"SimpleStorage: Unexpected error while trying to save user configuration "+
  253. "for user "+user+"("+ex.getMessage()+").");
  254.     if(debug) ex.printStackTrace();
  255. }
  256.     }
  257.     /**
  258.      * Delete a WebMail user
  259.      * @param user Name of the user to delete
  260.      */
  261.     public void deleteUserData(String user, String domain) {
  262. String path=parent.getProperty("webmail.data.path")+System.getProperty("file.separator")+
  263.     domain+System.getProperty("file.separator")+user+".xml";
  264. File f=new File(path);
  265. if(!f.canWrite() || !f.delete()) {
  266.     log(Storage.LOG_ERR,"SimpleStorage: Could not delete user "+user+" ("+path+")!");
  267. } else {
  268.     log(Storage.LOG_INFO,"SimpleStorage: Deleted user "+user+"!");
  269. }
  270. user_cache.remove(user+"@"+domain);
  271.     }
  272.     public String toString() {
  273. String s="SimpleStorage:n"+super.toString();
  274. s+=" - user cache:  Capacity "+user_cache.getCapacity()+", Usage "+user_cache.getUsage();
  275. s+=", "+user_cache.getHits()+" hits, "+user_cache.getMisses()+" missesn";
  276. return s;
  277.     }
  278. }