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

WEB邮件程序

开发平台:

C/C++

  1. /* CVS ID $Id: XMLUserData.java,v 1.4 2000/04/18 13:13:38 wastl Exp $ */
  2. package net.wastl.webmail.xml;
  3. import net.wastl.webmail.config.*;
  4. import net.wastl.webmail.server.*;
  5. import net.wastl.webmail.misc.*;
  6. import java.util.*;
  7. import java.text.*;
  8. import org.apache.xerces.framework.*;
  9. import org.apache.xerces.parsers.*;
  10. import org.apache.xalan.xslt.*;
  11. import org.apache.xml.serialize.*;
  12. import org.w3c.dom.*;
  13. /**
  14.  * XMLUserData.java
  15.  *
  16.  * Created: Fri Mar 10 16:17:28 2000
  17.  *
  18.  * Copyright (C) 2000 Sebastian Schaffert
  19.  * 
  20.  * This program is free software; you can redistribute it and/or
  21.  * modify it under the terms of the GNU General Public License
  22.  * as published by the Free Software Foundation; either version 2
  23.  * of the License, or (at your option) any later version.
  24.  * 
  25.  * This program is distributed in the hope that it will be useful,
  26.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  27.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  28.  * GNU General Public License for more details.
  29.  * 
  30.  * You should have received a copy of the GNU General Public License
  31.  * along with this program; if not, write to the Free Software
  32.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  33.  */
  34. /**
  35.  *
  36.  *
  37.  *
  38.  * @author Sebastian Schaffert
  39.  * @version
  40.  */
  41. public class XMLUserData implements UserData {
  42.     
  43.     protected Document root;
  44.     protected Element userdata;
  45.     protected boolean debug;
  46.     public XMLUserData(Document d) {
  47. debug=WebMailServer.getDebug();
  48. root=d;
  49. userdata=root.getDocumentElement();
  50. if(userdata==null) {
  51.     System.err.println("UserData was null ???");
  52.     userdata=root.createElement("USERDATA");
  53.     root.appendChild(userdata);
  54. }
  55.     }
  56.     public void init(String user, String domain, String password) {
  57. setUserName(user);
  58. setDomain(domain);
  59. setFullName(user);
  60. setEmail(user+"@"+domain);
  61. try {
  62.     setPassword(password,password);
  63. } catch(InvalidPasswordException ex) {}
  64. setPreferredLocale(Locale.getDefault().toString());
  65. setTheme("default");
  66. setIntVar("first login",System.currentTimeMillis());
  67. setIntVar("last login", System.currentTimeMillis());
  68. setIntVar("login count",0);
  69. setIntVar("max show messages",20);
  70. setIntVar("icon size",64);
  71. setBoolVar("break lines",true);
  72. setIntVar("max line length",79);
  73.     }
  74.     public Document getRoot() {
  75. return root;
  76.     }
  77.     public Element getUserData() {
  78. return userdata;
  79.     }
  80.     
  81.     public DocumentFragment getDocumentFragment() {
  82. DocumentFragment df=root.createDocumentFragment();
  83. df.appendChild(userdata);
  84. return df;
  85.     }
  86.     /**
  87.      * @deprecated Use Authenticators and login() instead
  88.      */
  89.     public void login(String password) throws InvalidPasswordException {
  90. if(!checkPassword(password)) {
  91.     throw new InvalidPasswordException("Invalid password for user "+getLogin());
  92. }
  93.     }
  94.     protected void ensureElement(String tag, String attribute, String att_value) {
  95. NodeList nl=userdata.getElementsByTagName(tag);
  96. boolean flag=false;
  97. for(int i=0;i<nl.getLength();i++) {
  98.     Element e=(Element)nl.item(i);
  99.     if(attribute == null) {
  100. // No attribute required
  101. flag=true;
  102. break;
  103.     } else if(att_value == null) {
  104. if(e.getAttributeNode(attribute) != null) {
  105.     // Attribute exists, value is not requested
  106.     flag=true;
  107.     break;
  108. }
  109.     } else if(e.getAttribute(attribute).equals(att_value)) {
  110. flag=true;
  111. break;
  112.     }
  113. }
  114. if(!flag) {
  115.     Element elem=root.createElement(tag);
  116.     if(attribute != null) {
  117. elem.setAttribute(attribute,att_value==null?"":att_value);
  118.     }
  119.     userdata.appendChild(elem);
  120. }
  121.     }
  122.     public void login() {
  123. // Increase login count and last login pointer
  124. setIntVar("last login",System.currentTimeMillis());
  125. setIntVar("login count",getIntVar("login count")+1);
  126.     }
  127.     public void addMailHost(String name, String host, String login, String password) {
  128. // First, check whether a mailhost with this name already exists.
  129. // Delete, if yes.
  130. try {
  131.     //System.err.println("Adding mailhost "+name);
  132.     if(getMailHost(name) != null) {
  133. removeMailHost(name);
  134.     }
  135.     Element mailhost=root.createElement("MAILHOST");
  136.     mailhost.setAttribute("name",name);
  137.     mailhost.setAttribute("id",Long.toHexString(Math.abs(name.hashCode()))+Long.toHexString(System.currentTimeMillis()));
  138.     
  139.     Element mh_login=root.createElement("MH_LOGIN");
  140.     XMLCommon.setElementTextValue(mh_login,login);
  141.     mailhost.appendChild(mh_login);
  142.     
  143.     Element mh_pass=root.createElement("MH_PASSWORD");
  144.     XMLCommon.setElementTextValue(mh_pass,Helper.encryptTEA(password));
  145.     mailhost.appendChild(mh_pass);
  146.     
  147.     Element mh_uri=root.createElement("MH_URI");
  148.     XMLCommon.setElementTextValue(mh_uri,host);
  149.     mailhost.appendChild(mh_uri);
  150.     
  151.     userdata.appendChild(mailhost);
  152.     //System.err.println("Done mailhost "+name);
  153.     //XMLCommon.writeXML(root,System.err,"");
  154. } catch(Exception ex) {
  155.     ex.printStackTrace();
  156. }
  157.     }
  158.     public void removeMailHost(String id) {
  159. Element n=XMLCommon.getElementByAttribute(userdata,"MAILHOST","id",id);
  160. if(n!=null) {
  161.     userdata.removeChild(n);
  162. }
  163.     }
  164.     public MailHostData getMailHost(String id) {
  165. final Element mailhost=XMLCommon.getElementByAttribute(userdata,"MAILHOST","id",id);
  166. return new MailHostData() {
  167. public String getPassword() {
  168.     return Helper.decryptTEA(XMLCommon.getTagValue(mailhost,"MH_PASSWORD"));
  169. }
  170. public void setPassword(String s) {
  171.     XMLCommon.setTagValue(mailhost,"MH_PASSWORD",Helper.encryptTEA(s));
  172. }
  173. public String getLogin() {
  174.     return XMLCommon.getTagValue(mailhost,"MH_LOGIN");
  175. }
  176.   public String getName() { 
  177.     return mailhost.getAttribute("name"); 
  178. }
  179. public void setLogin(String s) {
  180.     XMLCommon.setTagValue(mailhost,"MH_LOGIN",s);
  181. }
  182.   public void setName(String s) { 
  183.     mailhost.setAttribute("name",s);
  184. }
  185. public String getHostURL() {
  186.     return XMLCommon.getTagValue(mailhost,"MH_URI");
  187. }
  188. public void setHostURL(String s) {
  189.     XMLCommon.setTagValue(mailhost,"MH_URI",s);
  190. }
  191. public String getID() {
  192.     return mailhost.getAttribute("id");
  193. }
  194.     };
  195.     }
  196.     public Enumeration mailHosts() { 
  197. final NodeList nl=userdata.getElementsByTagName("MAILHOST");
  198. return new Enumeration() {
  199. int i=0;
  200. public boolean hasMoreElements() {
  201.     return i<nl.getLength();
  202. }
  203. public Object nextElement() {
  204.     Element e=(Element)nl.item(i++);
  205.     return e.getAttribute("id");
  206. }
  207.     };
  208.     }
  209.  
  210.     public int getMaxShowMessages() { 
  211. int retval=(int)getIntVarWrapper("max show messages");
  212. return retval==0?20:retval;
  213.     }
  214.     public void setMaxShowMessages(int i) { 
  215. setIntVarWrapper("max show messages",i);
  216.     }
  217.     /**
  218.      * As of WebMail 0.7.0 this is different from the username, because it
  219.      * consists of the username and the domain.
  220.      * @see getUserName
  221.      */
  222.     public String getLogin() { 
  223. return getUserName()+"@"+getDomain(); 
  224.     }
  225.     public String getFullName() {
  226. return XMLCommon.getTagValue(userdata,"FULL_NAME");
  227.     }
  228.     public void setFullName(String s) { 
  229. XMLCommon.setTagValue(userdata,"FULL_NAME",s);
  230.     }
  231.     public String getSignature() { 
  232. return XMLCommon.getTagValue(userdata,"SIGNATURE");
  233.     }
  234.     public void setSignature(String s) { 
  235. XMLCommon.setTagValue(userdata,"SIGNATURE",s,true);
  236.     }
  237.     public String getEmail() { 
  238. return XMLCommon.getTagValue(userdata,"EMAIL");
  239.     }
  240.     public void setEmail(String s) { 
  241. XMLCommon.setTagValue(userdata,"EMAIL",s);
  242.     }
  243.     public Locale getPreferredLocale() { 
  244. String loc=XMLCommon.getTagValue(userdata,"LOCALE");
  245. StringTokenizer t=new StringTokenizer(loc,"_");
  246. String language=t.nextToken().toLowerCase();
  247. String country="";
  248. if(t.hasMoreTokens()) {
  249.     country=t.nextToken().toUpperCase();
  250. }
  251. return new Locale(language,country);
  252.     }
  253.     public void setPreferredLocale(String newloc) { 
  254. XMLCommon.setTagValue(userdata,"LOCALE",newloc);
  255.     }
  256.     public String getTheme() {
  257. return XMLCommon.getTagValue(userdata,"THEME");
  258.     }
  259.     public void setTheme(String theme) {
  260. XMLCommon.setTagValue(userdata,"THEME",theme);
  261.     }
  262.     private String formatDate(long date) {
  263. TimeZone tz=TimeZone.getDefault();
  264. DateFormat df=DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.DEFAULT, getPreferredLocale());
  265. df.setTimeZone(tz);
  266. String now=df.format(new Date(date));
  267. return now;
  268.     }
  269.     public String getFirstLogin() {
  270. long date=getIntVarWrapper("first login");
  271. return formatDate(date);
  272.     }
  273.     public String getLastLogin() { 
  274. long date=getIntVarWrapper("last login");
  275. return formatDate(date);
  276.     }
  277.     public String getLoginCount() { 
  278. return getIntVarWrapper("login count")+"";
  279.     }
  280.     public boolean checkPassword(String s) { 
  281. String password=XMLCommon.getTagValue(userdata,"PASSWORD");
  282. return password.equals(Helper.crypt(password,s));
  283.     }
  284.     public void setPassword(String newpasswd, String verify) throws InvalidPasswordException {
  285. if(newpasswd.equals(verify)) {
  286.     Random r=new Random();
  287.     String seed=(char)(r.nextInt()%25+65) + "" + (char)(r.nextInt()%58+65);
  288.     XMLCommon.setTagValue(userdata,"PASSWORD",Helper.crypt(seed,newpasswd));
  289. } else {
  290.     throw new InvalidPasswordException("The passwords did not match!");
  291. }
  292.     }
  293.     public int getMaxLineLength() {
  294. int retval=(int)getIntVarWrapper("max line length");
  295. return retval==0?79:retval;
  296.     }
  297.     public void setMaxLineLength(int i) {
  298. setIntVarWrapper("max line length",i);
  299.     }
  300.     public boolean wantsBreakLines() {
  301. return getBoolVarWrapper("break lines");
  302.     }
  303.     public void setBreakLines(boolean b) {
  304. setBoolVarWrapper("break lines",b);
  305.     }
  306.     public boolean wantsShowImages() {
  307. return getBoolVarWrapper("show images");
  308.     }
  309.     public void setShowImages(boolean b) {
  310. setBoolVarWrapper("show images",b);
  311.     }
  312.     public boolean wantsShowFancy() { 
  313. return getBoolVarWrapper("show fancy");
  314.     }
  315.     public void setShowFancy(boolean b) {
  316. setBoolVarWrapper("show fancy",b);
  317.     }
  318.     public boolean wantsSetFlags() { 
  319. return getBoolVarWrapper("set message flags");
  320.     }
  321.     public void setSetFlags(boolean b) {
  322. setBoolVarWrapper("set message flags",b);
  323.     }
  324.     public void setSaveSent(boolean b) {
  325. setBoolVarWrapper("save sent messages",b);
  326.     }
  327.     public boolean wantsSaveSent() {
  328. return getBoolVarWrapper("save sent messages");
  329.     }
  330.     public String getSentFolder() { 
  331. return XMLCommon.getTagValue(userdata,"SENT_FOLDER");
  332.     }
  333.     public void setSentFolder(String s) { 
  334. XMLCommon.setTagValue(userdata,"SENT_FOLDER",s);
  335.     }
  336.     public String getDomain() {
  337. return XMLCommon.getTagValue(userdata,"USER_DOMAIN");
  338.     }
  339.     public void setDomain(String s) {
  340. XMLCommon.setTagValue(userdata,"USER_DOMAIN",s);
  341.     }
  342.     /**
  343.      * Return the username without the domain (in contrast to getLogin()).
  344.      * @see getLogin
  345.      */
  346.     public String getUserName() {
  347. return XMLCommon.getTagValue(userdata,"LOGIN"); 
  348.     }
  349.     public void setUserName(String s) { 
  350. XMLCommon.setTagValue(userdata,"LOGIN",s);
  351.     }
  352.     public void setIntVar(String var, long value) {
  353. setIntVarWrapper(var,value);
  354.     }
  355.     public long getIntVar(String var) {
  356. return getIntVarWrapper(var);
  357.     }
  358.     public void setBoolVar(String var, boolean value) {
  359. setBoolVarWrapper(var,value);
  360.     }
  361.     public boolean getBoolVar(String var) {
  362. return getBoolVarWrapper(var);
  363.     }
  364.     /**
  365.      * Wrapper method for setting all bool vars
  366.      */
  367.     protected void setIntVarWrapper(String var, long value) {
  368. ensureElement("INTVAR","name",var);
  369. Element e=XMLCommon.getElementByAttribute(userdata,"INTVAR","name",var);
  370. e.setAttribute("value",value+"");
  371. if(debug) System.err.println("XMLUserData ("+getUserName()+"@"+getDomain()+"): Setting '"+var+"' to '"+value+"'");
  372.     }
  373.     protected long getIntVarWrapper(String var) {
  374. ensureElement("INTVAR","name",var);
  375. Element e=XMLCommon.getElementByAttribute(userdata,"INTVAR","name",var);
  376. long r=0;
  377. try {
  378.     r=Long.parseLong(e.getAttribute("value"));
  379. } catch(NumberFormatException ex) {
  380.     System.err.println("Warning: Not a valid number in '"+var+"' for user "+
  381.        getUserName()+"@"+getDomain());
  382. }
  383. return r;
  384.     }
  385.     /**
  386.      * Wrapper method for setting all bool vars
  387.      */
  388.     protected void setBoolVarWrapper(String var, boolean value) {
  389. ensureElement("BOOLVAR","name",var);
  390. Element e=XMLCommon.getElementByAttribute(userdata,"BOOLVAR","name",var);
  391. e.setAttribute("value",value?"yes":"no");
  392. if(debug) System.err.println("XMLUserData ("+getUserName()+"@"+getDomain()+"): Setting '"+var+"' to '"+value+"'");
  393.     }
  394.     protected boolean getBoolVarWrapper(String var) {
  395. ensureElement("BOOLVAR","name",var);
  396. Element e=XMLCommon.getElementByAttribute(userdata,"BOOLVAR","name",var);
  397. return (e.getAttribute("value").toUpperCase().equals("YES") || 
  398. e.getAttribute("value").toUpperCase().equals("TRUE"));
  399.     }
  400.     /**
  401.      * Set all boolvars to "false".
  402.      *
  403.      */
  404.     public void resetBoolVars() {
  405. NodeList nl=root.getElementsByTagName("BOOLVAR");
  406. for(int i=0;i<nl.getLength();i++) {
  407.     Element elem=(Element)nl.item(i);
  408.     elem.setAttribute("value","no");
  409. }
  410.     }
  411.     
  412. } // XMLUserData