|
What this is
Other links
The source code
/* CVS ID: $Id: Storage.java,v 1.1.1.1 2002/10/02 18:42:51 wastl Exp $ */
package net.wastl.webmail.server;
import net.wastl.webmail.config.*;
import net.wastl.webmail.xml.*;
import net.wastl.webmail.exceptions.*;
import java.io.*;
import java.util.*;
import javax.xml.transform.Templates;
import javax.xml.parsers.ParserConfigurationException;
/*
* Storage.java
*
* Created: Feb 1999
*
* Copyright (C) 1999-2000 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.
*/
/**
*
*
* This provides a generic interface for getting and setting stored
* data in WebMail.
*
* @see net.wastl.webmail.storage.simple.SimpleStorage
* @author Sebastian Schaffert
* @version $Revision: 1.1.1.1 $
*/
/* 9/24/2000 devink - updated for new challenge/response authentication */
public abstract class Storage {
public static final int LOG_DEBUG=10;
public static final int LOG_INFO=5;
public static final int LOG_WARN=3;
public static final int LOG_ERR=1;
public static final int LOG_CRIT=0;
protected static boolean debug;
protected WebMailServer parent;
protected ConfigScheme cs;
protected XMLSystemData sysdata;
protected XMLGenericModel generic_model;
public Storage(WebMailServer parent) {
debug=WebMailServer.getDebug();
this.parent=parent;
cs=parent.getConfigScheme();
cs.configRegisterYesNoKey("FOLDER TRY LOGIN PASSWORD","Try to connect folders with the user's login password if authentication fails");
}
public void initConfigKeys() {
// Initialize the configuration file with the default or set parameters
// needed to complete the XML file
Enumeration enum=cs.getPossibleKeys();
while(enum.hasMoreElements()) {
String key=(String)enum.nextElement();
if(!sysdata.isConfigSet(key)) {
// We must use the raw method so the input doesn't get filtered.
sysdata.setConfig(key,(String)cs.getDefaultValue(key),false,false);
}
}
saveXMLSysData();
}
public void setDebug(boolean b) {
debug=b;
}
public boolean getDebug() {
return debug;
}
/**
* Fetch all keys of the current configuration.
*/
public Enumeration getConfigKeys() {
return cs.getPossibleKeys();
}
/**
* Fetch the configuration associated with the specified key.
* @param key Identifier for the configuration
*/
public String getConfig(String key) {
return sysdata.getConfig(key);
}
/**
* Set a configuration "key" to the specified value.
* @param key Identifier for the configuration
* @param value value to set
*/
public void setConfig(String key, String value) throws IllegalArgumentException {
// Modified by exce, start
/**
* Maybe here is a bug.
*
* Consider that if administrator happens to delete the value of certain
* key, that is, the key is an empty tag.
* FileStorage.java:272 call ConfigScheme.configRegister???Key() to set
* value first, which becomes a default value, then call this function.
* However, ConfigStore.getConfig() returns default value
* if the key is an empty tag in configuration file that getConfigRaw()
* returns null/empty value. That means the value passing in here is always
* equals to the value returned by ConfigStore.getConfig().
*
* The simplest way to enforce saving config data is to comment out the
* if statement. However, this may be a performance issue, so I don't
* modify the code.
*/
// Modified by exce, end
if(!value.equals(getConfig(key))) {
log(LOG_DEBUG,"Storage API: Setting configuration for '"+key+"' to '"+value+"'.");
sysdata.setConfig(key,value);
saveXMLSysData();
}
}
/**
* Get the String for key and the specified locale.
* @param key Identifier for the String
* @param locale locale of the String to fetch
*/
public abstract String getStringResource(String key, Locale locale);
/**
* Get a xsl stylesheet for the specified locale and theme.
* @param key Identifier for the String
* @param locale locale of the String to fetch
* @param theme theme where to look for the file
*/
public abstract Templates getStylesheet(String name, Locale locale, String theme) throws WebMailException;
/**
* Get a binary file (most likely an image) for the specified locale and theme.
* @param key Identifier for the String
* @param locale locale of the String to fetch
* @param theme theme where to look for the file
*/
public abstract byte[] getBinaryFile(String name, Locale locale, String theme) throws BinaryNotFoundException;
/**
* Calculate the document base path for a given locale and theme
*/
public String getBasePath(Locale locale, String theme) {
String language_path=(parent.getProperty("webmail.template.path")+
System.getProperty("file.separator")+locale.getLanguage());
File f=new File(language_path);
if(!f.exists()) {
language_path=(parent.getProperty("webmail.template.path")+
System.getProperty("file.separator")+parent.getDefaultLocale().getLanguage());
f=new File(language_path);
if(!f.exists()) {
System.err.println("Storage::getBasePath: Default Language templates not found \n(tried path: "+language_path+")");
}
}
String theme_path=language_path+System.getProperty("file.separator")+theme;
f=new File(theme_path);
if(!f.exists()) {
if(parent.getProperty("webmail.default.theme") != null) {
theme_path=language_path+System.getProperty("file.separator")+
parent.getProperty("webmail.default.theme");
} else {
theme_path=language_path+System.getProperty("file.separator")+
"bibop";
}
f=new File(theme_path);
if(!f.exists()) {
System.err.println("Storage::getBasePath: Theme could not be found; probably a problem with your\n installation. Please check the lib/templates/bibop directory and the \nwebmail.default.theme property");
}
}
String basepath=theme_path+System.getProperty("file.separator");
return basepath;
}
public XMLSystemData getSystemData() {
return sysdata;
}
public XMLUserModel createXMLUserModel(XMLUserData data) throws WebMailException {
try {
return new XMLUserModel(parent,sysdata.getSysData(),data.getUserData());
} catch(ParserConfigurationException ex) {
throw new WebMailException("Creating the generic XML model failed. Reason: "+
ex.getMessage());
}
}
/**
* Return a XML model that contains state and system information for administrator use
*/
public XMLAdminModel createXMLAdminModel() throws WebMailException {
try {
XMLAdminModel model=new XMLAdminModel(parent,sysdata.getSysData());
model.init();
model.update();
return model;
} catch(ParserConfigurationException ex) {
throw new WebMailException("Creating the generic XML model failed. Reason: "+
ex.getMessage());
}
}
/**
* Return a generic XML model that only contains some state and system information.
* This cannot be changed by a single session.
*/
public XMLGenericModel createXMLGenericModel() throws WebMailException {
try {
XMLGenericModel model=new XMLGenericModel(parent,sysdata.getSysData());
model.init();
model.update();
return model;
} catch(ParserConfigurationException ex) {
throw new WebMailException("Creating the generic XML model failed. Reason: "+
ex.getMessage());
}
}
/**
* Return userlist for a given domain.
*/
public abstract Enumeration getUsers(String domain);
/**
* @deprecated Use getUsers(String domain) instead
*/
public Enumeration getUsers() {
final Enumeration domains=getVirtualDomains();
return new Enumeration() {
Enumeration enum=null;
public boolean hasMoreElements() {
return (domains.hasMoreElements() || (enum != null && enum.hasMoreElements()));
}
public Object nextElement() {
if(enum == null || !enum.hasMoreElements()) {
if(domains.hasMoreElements()) {
enum=getUsers((String)domains.nextElement());
} else {
return null;
}
}
return enum.nextElement();
}
};
}
/**
* Get the userdata for the specified user.
* @param user Name of the user
* @param domain Virtual Domain name of the user
* @param passwd Password that the user provided
*
* devink 7/15/2000 - deprecated, but left in for backwards compat.
* devink 9/24/2000 - not deprecated any more
* XXX should passwd be a parameter?
*/
public XMLUserData getUserData(String user, String domain,String passwd)
throws UserDataException, InvalidPasswordException {
return getUserData(user,domain,passwd,false);
}
/**
* get the userdata for the specified user.
* Should do some sort of authentication if authentication is set. See
* Authenticator class for example.
*
* devink 7/15/2000 - depreciated, and is no longer abstract, so there is
* no requirement to implement it.
* devink 9/24/2000 - not depreciated, and is now abstract
*/
public abstract XMLUserData getUserData(String user, String domain,
String password, boolean authenticate)
throws UserDataException, InvalidPasswordException;
/**
* Create a userdata for the specified user
*/
public abstract XMLUserData createUserData(String user, String domain, String password)
throws CreateUserDataException;
/**
* Save the userdata for the given user.
* @param user Username of this user
* @param domain Domain of this user
*/
public abstract void saveUserData(String user, String domain);
/**
* Set the userdata for the specified user.
* @param user Name of the user
* @param userdata Data to store
* @deprecated use saveUserData instead.
*/
public void setUserData(String user, UserData userdata) {
// Call saveUserData, do nothing with "userdata"
StringTokenizer tok=new StringTokenizer(user,"@");
String login=tok.nextToken();
String domain="nodomain";
if(tok.hasMoreTokens()) {
domain=tok.nextToken();
}
saveUserData(login,domain);
}
/**
* Delete a WebMail user
* @param user Name of the user to delete
* @param domain Domain of that user
*/
public abstract void deleteUserData(String user, String domain);
/**
* Delete a WebMail user
* @param user Name of the user to delete
* @deprecated use deleteUserData(String user, String domain) instead.
*/
public void deleteUserData(String user) {
StringTokenizer tok=new StringTokenizer(user,"@");
String login=tok.nextToken();
String domain="nodomain";
if(tok.hasMoreTokens()) {
domain=tok.nextToken();
}
deleteUserData(user,domain);
}
/**
* Set/add a WebMail virtual domain
*/
public void setVirtualDomain(String name,WebMailVirtualDomain v) {
sysdata.setVirtualDomain(name,v);
saveXMLSysData();
}
/**
* Get a WebMail virtual domain
*/
public WebMailVirtualDomain getVirtualDomain(String name) {
return sysdata.getVirtualDomain(name);
}
public WebMailVirtualDomain createVirtualDomain(String name) throws Exception {
sysdata.createVirtualDomain(name);
return sysdata.getVirtualDomain(name);
}
/**
* Delete a WebMail virtual domain
*/
public void deleteVirtualDomain(String name) {
sysdata.deleteVirtualDomain(name);
}
/**
* Return a list of virtual domains
*/
public Enumeration getVirtualDomains() {
return sysdata.getVirtualDomains();
}
/**
* Return this Storage's Authenticator.
* This is necessary for changing passwords or re-checking authentication.
*/
public abstract Authenticator getAuthenticator();
/**
* Send a message to the logging facility.
* @param level severity level of the message
* @param message the message
*/
public abstract void log(int level, String message);
/**
* Send an exception to the logging facility.
* @param level severity level of the message
* @param message the message
*/
public abstract void log(int level, Exception ex);
public abstract void shutdown();
public void save() {
saveXMLSysData();
}
protected abstract void loadXMLSysData();
protected abstract void saveXMLSysData();
public String getMimeType(String name) {
String content_type;
if(name != null && (name.toLowerCase().endsWith("jpg") || name.toLowerCase().endsWith("jpeg"))) {
content_type="IMAGE/JPEG";
} else if(name != null && name.toLowerCase().endsWith("gif")) {
content_type="IMAGE/GIF";
} else if(name != null && name.toLowerCase().endsWith("png")) {
content_type="IMAGE/PNG";
} else if(name != null && name.toLowerCase().endsWith("txt")) {
content_type="TEXT/PLAIN";
} else if(name != null && (name.toLowerCase().endsWith("htm") || name.toLowerCase().endsWith("html"))) {
content_type="TEXT/HTML";
} else {
content_type="APPLICATION/OCTET-STREAM";
}
return content_type;
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.