funkman 2004/07/02 09:25:31
Modified: catalina/src/share/org/apache/naming/resources
FileDirContext.java LocalStrings.properties
Log:
If the dir listing errors, return an empty array instead of ending up with
a NPE.
Occured when a non-readable dir appeared inside the classes dir and
TldLocationsCache was trying to init. An error was thrown and it said null.
Now it keeps going and logs a warning message stating a directory
could not be listed.
Revision Changes Path
1.5 +278 -268
jakarta-tomcat-catalina/catalina/src/share/org/apache/naming/resources/FileDirContext.java
Index: FileDirContext.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/naming/resources/FileDirContext.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- FileDirContext.java 27 Feb 2004 14:58:54 -0000 1.4
+++ FileDirContext.java 2 Jul 2004 16:25:31 -0000 1.5
@@ -1,18 +1,18 @@
/*
* Copyright 1999,2004 The Apache Software Foundation.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
- */
+ */
package org.apache.naming.resources;
@@ -49,6 +49,8 @@
public class FileDirContext extends BaseDirContext {
+ private static org.apache.commons.logging.Log log=
+ org.apache.commons.logging.LogFactory.getLog( FileDirContext.class );
// -------------------------------------------------------------- Constants
@@ -110,9 +112,9 @@
/**
* Set the document root.
- *
+ *
* @param docBase The new document root
- *
+ *
* @exception IllegalArgumentException if the specified value is not
* supported by this implementation
* @exception IllegalArgumentException if this would create a
@@ -120,23 +122,23 @@
*/
public void setDocBase(String docBase) {
- // Validate the format of the proposed document root
- if (docBase == null)
- throw new IllegalArgumentException
- (sm.getString("resources.null"));
+ // Validate the format of the proposed document root
+ if (docBase == null)
+ throw new IllegalArgumentException
+ (sm.getString("resources.null"));
- // Calculate a File object referencing this document base directory
- base = new File(docBase);
+ // Calculate a File object referencing this document base directory
+ base = new File(docBase);
try {
base = base.getCanonicalFile();
} catch (IOException e) {
// Ignore
}
- // Validate that the document base is an existing directory
- if (!base.exists() || !base.isDirectory() || !base.canRead())
- throw new IllegalArgumentException
- (sm.getString("fileResources.base", docBase));
+ // Validate that the document base is an existing directory
+ if (!base.exists() || !base.isDirectory() || !base.canRead())
+ throw new IllegalArgumentException
+ (sm.getString("fileResources.base", docBase));
this.absoluteBase = base.getAbsolutePath();
super.setDocBase(docBase);
@@ -197,7 +199,7 @@
/**
* Retrieves the named object.
- *
+ *
* @param name the name of the object to look up
* @return the object bound to name
* @exception NamingException if a naming exception is encountered
@@ -206,11 +208,11 @@
throws NamingException {
Object result = null;
File file = file(name);
-
+
if (file == null)
throw new NamingException
(sm.getString("resources.notFound", name));
-
+
if (file.isDirectory()) {
FileDirContext tempContext = new FileDirContext(env);
tempContext.setDocBase(file.getPath());
@@ -218,23 +220,23 @@
} else {
result = new FileResource(file);
}
-
+
return result;
-
+
}
/**
- * Unbinds the named object. Removes the terminal atomic name in name
- * from the target context--that named by all but the terminal atomic
+ * Unbinds the named object. Removes the terminal atomic name in name
+ * from the target context--that named by all but the terminal atomic
* part of name.
* <p>
- * This method is idempotent. It succeeds even if the terminal atomic
- * name is not bound in the target context, but throws
- * NameNotFoundException if any of the intermediate contexts do not exist.
- *
+ * This method is idempotent. It succeeds even if the terminal atomic
+ * name is not bound in the target context, but throws
+ * NameNotFoundException if any of the intermediate contexts do not exist.
+ *
* @param name the name to bind; may not be empty
- * @exception NameNotFoundException if an intermediate context does not
+ * @exception NameNotFoundException if an intermediate context does not
* exist
* @exception NamingException if a naming exception is encountered
*/
@@ -255,11 +257,11 @@
/**
- * Binds a new name to the object bound to an old name, and unbinds the
- * old name. Both names are relative to this context. Any attributes
- * associated with the old name become associated with the new name.
+ * Binds a new name to the object bound to an old name, and unbinds the
+ * old name. Both names are relative to this context. Any attributes
+ * associated with the old name become associated with the new name.
* Intermediate contexts of the old name are not changed.
- *
+ *
* @param oldName the name of the existing binding; may not be empty
* @param newName the name of the new binding; may not be empty
* @exception NameAlreadyBoundException if newName is already bound
@@ -267,7 +269,7 @@
*/
public void rename(String oldName, String newName)
throws NamingException {
-
+
File file = file(oldName);
if (file == null)
@@ -275,22 +277,22 @@
(sm.getString("resources.notFound", oldName));
File newFile = new File(base, newName);
-
+
file.renameTo(newFile);
-
+
}
/**
- * Enumerates the names bound in the named context, along with the class
- * names of objects bound to them. The contents of any subcontexts are
+ * Enumerates the names bound in the named context, along with the class
+ * names of objects bound to them. The contents of any subcontexts are
* not included.
* <p>
- * If a binding is added to or removed from this context, its effect on
+ * If a binding is added to or removed from this context, its effect on
* an enumeration previously returned is undefined.
- *
+ *
* @param name the name of the context to list
- * @return an enumeration of the names and class names of the bindings in
+ * @return an enumeration of the names and class names of the bindings in
* this context. Each element of the enumeration is of type NameClassPair.
* @exception NamingException if a naming exception is encountered
*/
@@ -311,15 +313,15 @@
/**
- * Enumerates the names bound in the named context, along with the
- * objects bound to them. The contents of any subcontexts are not
+ * Enumerates the names bound in the named context, along with the
+ * objects bound to them. The contents of any subcontexts are not
* included.
* <p>
- * If a binding is added to or removed from this context, its effect on
+ * If a binding is added to or removed from this context, its effect on
* an enumeration previously returned is undefined.
- *
+ *
* @param name the name of the context to list
- * @return an enumeration of the bindings in this context.
+ * @return an enumeration of the bindings in this context.
* Each element of the enumeration is of type Binding.
* @exception NamingException if a naming exception is encountered
*/
@@ -340,28 +342,28 @@
/**
- * Destroys the named context and removes it from the namespace. Any
- * attributes associated with the name are also removed. Intermediate
+ * Destroys the named context and removes it from the namespace. Any
+ * attributes associated with the name are also removed. Intermediate
* contexts are not destroyed.
* <p>
- * This method is idempotent. It succeeds even if the terminal atomic
- * name is not bound in the target context, but throws
- * NameNotFoundException if any of the intermediate contexts do not exist.
- *
- * In a federated naming system, a context from one naming system may be
- * bound to a name in another. One can subsequently look up and perform
- * operations on the foreign context using a composite name. However, an
- * attempt destroy the context using this composite name will fail with
- * NotContextException, because the foreign context is not a "subcontext"
- * of the context in which it is bound. Instead, use unbind() to remove
- * the binding of the foreign context. Destroying the foreign context
- * requires that the destroySubcontext() be performed on a context from
+ * This method is idempotent. It succeeds even if the terminal atomic
+ * name is not bound in the target context, but throws
+ * NameNotFoundException if any of the intermediate contexts do not exist.
+ *
+ * In a federated naming system, a context from one naming system may be
+ * bound to a name in another. One can subsequently look up and perform
+ * operations on the foreign context using a composite name. However, an
+ * attempt destroy the context using this composite name will fail with
+ * NotContextException, because the foreign context is not a "subcontext"
+ * of the context in which it is bound. Instead, use unbind() to remove
+ * the binding of the foreign context. Destroying the foreign context
+ * requires that the destroySubcontext() be performed on a context from
* the foreign context's "native" naming system.
- *
+ *
* @param name the name of the context to be destroyed; may not be empty
- * @exception NameNotFoundException if an intermediate context does not
+ * @exception NameNotFoundException if an intermediate context does not
* exist
- * @exception NotContextException if the name is bound but does not name
+ * @exception NotContextException if the name is bound but does not name
* a context, or does not name a context of the appropriate type
*/
public void destroySubcontext(String name)
@@ -371,12 +373,12 @@
/**
- * Retrieves the named object, following links except for the terminal
- * atomic component of the name. If the object bound to name is not a
+ * Retrieves the named object, following links except for the terminal
+ * atomic component of the name. If the object bound to name is not a
* link, returns the object itself.
- *
+ *
* @param name the name of the object to look up
- * @return the object bound to name, not following the terminal link
+ * @return the object bound to name, not following the terminal link
* (if any).
* @exception NamingException if a naming exception is encountered
*/
@@ -390,17 +392,17 @@
/**
* Retrieves the full name of this context within its own namespace.
* <p>
- * Many naming services have a notion of a "full name" for objects in
- * their respective namespaces. For example, an LDAP entry has a
- * distinguished name, and a DNS record has a fully qualified name. This
- * method allows the client application to retrieve this name. The string
- * returned by this method is not a JNDI composite name and should not be
- * passed directly to context methods. In naming systems for which the
- * notion of full name does not make sense,
+ * Many naming services have a notion of a "full name" for objects in
+ * their respective namespaces. For example, an LDAP entry has a
+ * distinguished name, and a DNS record has a fully qualified name. This
+ * method allows the client application to retrieve this name. The string
+ * returned by this method is not a JNDI composite name and should not be
+ * passed directly to context methods. In naming systems for which the
+ * notion of full name does not make sense,
* OperationNotSupportedException is thrown.
- *
+ *
* @return this context's name in its own namespace; never null
- * @exception OperationNotSupportedException if the naming system does
+ * @exception OperationNotSupportedException if the naming system does
* not have the notion of a full name
* @exception NamingException if a naming exception is encountered
*/
@@ -414,14 +416,14 @@
/**
- * Retrieves selected attributes associated with a named object.
- * See the class description regarding attribute models, attribute type
+ * Retrieves selected attributes associated with a named object.
+ * See the class description regarding attribute models, attribute type
* names, and operational attributes.
- *
+ *
* @return the requested attributes; never null
* @param name the name of the object from which to retrieve attributes
- * @param attrIds the identifiers of the attributes to retrieve. null
- * indicates that all attributes should be retrieved; an empty array
+ * @param attrIds the identifiers of the attributes to retrieve. null
+ * indicates that all attributes should be retrieved; an empty array
* indicates that none should be retrieved
* @exception NamingException if a naming exception is encountered
*/
@@ -441,14 +443,14 @@
/**
- * Modifies the attributes associated with a named object. The order of
- * the modifications is not specified. Where possible, the modifications
+ * Modifies the attributes associated with a named object. The order of
+ * the modifications is not specified. Where possible, the modifications
* are performed atomically.
- *
+ *
* @param name the name of the object whose attributes will be updated
- * @param mod_op the modification operation, one of: ADD_ATTRIBUTE,
+ * @param mod_op the modification operation, one of: ADD_ATTRIBUTE,
* REPLACE_ATTRIBUTE, REMOVE_ATTRIBUTE
- * @param attrs the attributes to be used for the modification; may not
+ * @param attrs the attributes to be used for the modification; may not
* be null
* @exception AttributeModificationException if the modification cannot be
* completed successfully
@@ -456,19 +458,19 @@
*/
public void modifyAttributes(String name, int mod_op, Attributes attrs)
throws NamingException {
-
+
}
/**
- * Modifies the attributes associated with a named object using an an
- * ordered list of modifications. The modifications are performed in the
- * order specified. Each modification specifies a modification operation
- * code and an attribute on which to operate. Where possible, the
+ * Modifies the attributes associated with a named object using an an
+ * ordered list of modifications. The modifications are performed in the
+ * order specified. Each modification specifies a modification operation
+ * code and an attribute on which to operate. Where possible, the
* modifications are performed atomically.
- *
+ *
* @param name the name of the object whose attributes will be updated
- * @param mods an ordered sequence of modifications to be performed; may
+ * @param mods an ordered sequence of modifications to be performed; may
* not be null
* @exception AttributeModificationException if the modification cannot be
* completed successfully
@@ -476,66 +478,66 @@
*/
public void modifyAttributes(String name, ModificationItem[] mods)
throws NamingException {
-
+
}
/**
- * Binds a name to an object, along with associated attributes. If attrs
- * is null, the resulting binding will have the attributes associated
- * with obj if obj is a DirContext, and no attributes otherwise. If attrs
- * is non-null, the resulting binding will have attrs as its attributes;
+ * Binds a name to an object, along with associated attributes. If attrs
+ * is null, the resulting binding will have the attributes associated
+ * with obj if obj is a DirContext, and no attributes otherwise. If attrs
+ * is non-null, the resulting binding will have attrs as its attributes;
* any attributes associated with obj are ignored.
- *
+ *
* @param name the name to bind; may not be empty
* @param obj the object to bind; possibly null
* @param attrs the attributes to associate with the binding
* @exception NameAlreadyBoundException if name is already bound
- * @exception InvalidAttributesException if some "mandatory" attributes
+ * @exception InvalidAttributesException if some "mandatory" attributes
* of the binding are not supplied
* @exception NamingException if a naming exception is encountered
*/
public void bind(String name, Object obj, Attributes attrs)
throws NamingException {
-
+
// Note: No custom attributes allowed
-
+
File file = new File(base, name);
if (file.exists())
throw new NameAlreadyBoundException
(sm.getString("resources.alreadyBound", name));
-
+
rebind(name, obj, attrs);
-
+
}
/**
- * Binds a name to an object, along with associated attributes,
- * overwriting any existing binding. If attrs is null and obj is a
- * DirContext, the attributes from obj are used. If attrs is null and obj
+ * Binds a name to an object, along with associated attributes,
+ * overwriting any existing binding. If attrs is null and obj is a
+ * DirContext, the attributes from obj are used. If attrs is null and obj
* is not a DirContext, any existing attributes associated with the object
- * already bound in the directory remain unchanged. If attrs is non-null,
- * any existing attributes associated with the object already bound in
- * the directory are removed and attrs is associated with the named
- * object. If obj is a DirContext and attrs is non-null, the attributes
+ * already bound in the directory remain unchanged. If attrs is non-null,
+ * any existing attributes associated with the object already bound in
+ * the directory are removed and attrs is associated with the named
+ * object. If obj is a DirContext and attrs is non-null, the attributes
* of obj are ignored.
- *
+ *
* @param name the name to bind; may not be empty
* @param obj the object to bind; possibly null
* @param attrs the attributes to associate with the binding
- * @exception InvalidAttributesException if some "mandatory" attributes
+ * @exception InvalidAttributesException if some "mandatory" attributes
* of the binding are not supplied
* @exception NamingException if a naming exception is encountered
*/
public void rebind(String name, Object obj, Attributes attrs)
throws NamingException {
-
+
// Note: No custom attributes allowed
// Check obj type
-
+
File file = new File(base, name);
-
+
InputStream is = null;
if (obj instanceof Resource) {
try {
@@ -557,9 +559,9 @@
if (is == null)
throw new NamingException
(sm.getString("resources.bindFailed", name));
-
+
// Open os
-
+
try {
FileOutputStream os = null;
byte buffer[] = new byte[BUFFER_SIZE];
@@ -581,30 +583,30 @@
throw new NamingException
(sm.getString("resources.bindFailed", e));
}
-
+
}
/**
- * Creates and binds a new context, along with associated attributes.
- * This method creates a new subcontext with the given name, binds it in
- * the target context (that named by all but terminal atomic component of
- * the name), and associates the supplied attributes with the newly
- * created object. All intermediate and target contexts must already
- * exist. If attrs is null, this method is equivalent to
+ * Creates and binds a new context, along with associated attributes.
+ * This method creates a new subcontext with the given name, binds it in
+ * the target context (that named by all but terminal atomic component of
+ * the name), and associates the supplied attributes with the newly
+ * created object. All intermediate and target contexts must already
+ * exist. If attrs is null, this method is equivalent to
* Context.createSubcontext().
- *
+ *
* @param name the name of the context to create; may not be empty
* @param attrs the attributes to associate with the newly created context
* @return the newly created context
* @exception NameAlreadyBoundException if the name is already bound
- * @exception InvalidAttributesException if attrs does not contain all
+ * @exception InvalidAttributesException if attrs does not contain all
* the mandatory attributes required for creation
* @exception NamingException if a naming exception is encountered
*/
public DirContext createSubcontext(String name, Attributes attrs)
throws NamingException {
-
+
File file = new File(base, name);
if (file.exists())
throw new NameAlreadyBoundException
@@ -613,18 +615,18 @@
throw new NamingException
(sm.getString("resources.bindFailed", name));
return (DirContext) lookup(name);
-
+
}
/**
- * Retrieves the schema associated with the named object. The schema
- * describes rules regarding the structure of the namespace and the
- * attributes stored within it. The schema specifies what types of
- * objects can be added to the directory and where they can be added;
- * what mandatory and optional attributes an object can have. The range
+ * Retrieves the schema associated with the named object. The schema
+ * describes rules regarding the structure of the namespace and the
+ * attributes stored within it. The schema specifies what types of
+ * objects can be added to the directory and where they can be added;
+ * what mandatory and optional attributes an object can have. The range
* of support for schemas is directory-specific.
- *
+ *
* @param name the name of the object whose schema is to be retrieved
* @return the schema associated with the context; never null
* @exception OperationNotSupportedException if schema not supported
@@ -637,12 +639,12 @@
/**
- * Retrieves a context containing the schema objects of the named
+ * Retrieves a context containing the schema objects of the named
* object's class definitions.
- *
- * @param name the name of the object whose object class definition is to
+ *
+ * @param name the name of the object whose object class definition is to
* be retrieved
- * @return the DirContext containing the named object's class
+ * @return the DirContext containing the named object's class
* definitions; never null
* @exception OperationNotSupportedException if schema not supported
* @exception NamingException if a naming exception is encountered
@@ -654,19 +656,19 @@
/**
- * Searches in a single context for objects that contain a specified set
- * of attributes, and retrieves selected attributes. The search is
+ * Searches in a single context for objects that contain a specified set
+ * of attributes, and retrieves selected attributes. The search is
* performed using the default SearchControls settings.
- *
+ *
* @param name the name of the context to search
- * @param matchingAttributes the attributes to search for. If empty or
+ * @param matchingAttributes the attributes to search for. If empty or
* null, all objects in the target context are returned.
- * @param attributesToReturn the attributes to return. null indicates
- * that all attributes are to be returned; an empty array indicates that
+ * @param attributesToReturn the attributes to return. null indicates
+ * that all attributes are to be returned; an empty array indicates that
* none are to be returned.
- * @return a non-null enumeration of SearchResult objects. Each
- * SearchResult contains the attributes identified by attributesToReturn
- * and the name of the corresponding object, named relative to the
+ * @return a non-null enumeration of SearchResult objects. Each
+ * SearchResult contains the attributes identified by attributesToReturn
+ * and the name of the corresponding object, named relative to the
* context named by name.
* @exception NamingException if a naming exception is encountered
*/
@@ -678,17 +680,17 @@
/**
- * Searches in a single context for objects that contain a specified set
- * of attributes. This method returns all the attributes of such objects.
- * It is equivalent to supplying null as the atributesToReturn parameter
+ * Searches in a single context for objects that contain a specified set
+ * of attributes. This method returns all the attributes of such objects.
+ * It is equivalent to supplying null as the atributesToReturn parameter
* to the method search(Name, Attributes, String[]).
- *
+ *
* @param name the name of the context to search
- * @param matchingAttributes the attributes to search for. If empty or
+ * @param matchingAttributes the attributes to search for. If empty or
* null, all objects in the target context are returned.
- * @return a non-null enumeration of SearchResult objects. Each
- * SearchResult contains the attributes identified by attributesToReturn
- * and the name of the corresponding object, named relative to the
+ * @return a non-null enumeration of SearchResult objects. Each
+ * SearchResult contains the attributes identified by attributesToReturn
+ * and the name of the corresponding object, named relative to the
* context named by name.
* @exception NamingException if a naming exception is encountered
*/
@@ -699,25 +701,25 @@
/**
- * Searches in the named context or object for entries that satisfy the
- * given search filter. Performs the search as specified by the search
+ * Searches in the named context or object for entries that satisfy the
+ * given search filter. Performs the search as specified by the search
* controls.
- *
+ *
* @param name the name of the context or object to search
- * @param filter the filter expression to use for the search; may not be
+ * @param filter the filter expression to use for the search; may not be
* null
- * @param cons the search controls that control the search. If null,
- * the default search controls are used (equivalent to
+ * @param cons the search controls that control the search. If null,
+ * the default search controls are used (equivalent to
* (new SearchControls())).
- * @return an enumeration of SearchResults of the objects that satisfy
+ * @return an enumeration of SearchResults of the objects that satisfy
* the filter; never null
- * @exception InvalidSearchFilterException if the search filter specified
+ * @exception InvalidSearchFilterException if the search filter specified
* is not supported or understood by the underlying directory
- * @exception InvalidSearchControlsException if the search controls
+ * @exception InvalidSearchControlsException if the search controls
* contain invalid settings
* @exception NamingException if a naming exception is encountered
*/
- public NamingEnumeration search(String name, String filter,
+ public NamingEnumeration search(String name, String filter,
SearchControls cons)
throws NamingException {
return null;
@@ -725,30 +727,30 @@
/**
- * Searches in the named context or object for entries that satisfy the
- * given search filter. Performs the search as specified by the search
+ * Searches in the named context or object for entries that satisfy the
+ * given search filter. Performs the search as specified by the search
* controls.
- *
+ *
* @param name the name of the context or object to search
- * @param filterExpr the filter expression to use for the search.
- * The expression may contain variables of the form "{i}" where i is a
+ * @param filterExpr the filter expression to use for the search.
+ * The expression may contain variables of the form "{i}" where i is a
* nonnegative integer. May not be null.
- * @param filterArgs the array of arguments to substitute for the
- * variables in filterExpr. The value of filterArgs[i] will replace each
+ * @param filterArgs the array of arguments to substitute for the
+ * variables in filterExpr. The value of filterArgs[i] will replace each
* occurrence of "{i}". If null, equivalent to an empty array.
- * @param cons the search controls that control the search. If null, the
+ * @param cons the search controls that control the search. If null, the
* default search controls are used (equivalent to (new SearchControls())).
- * @return an enumeration of SearchResults of the objects that satisy the
+ * @return an enumeration of SearchResults of the objects that satisy the
* filter; never null
- * @exception ArrayIndexOutOfBoundsException if filterExpr contains {i}
+ * @exception ArrayIndexOutOfBoundsException if filterExpr contains {i}
* expressions where i is outside the bounds of the array filterArgs
- * @exception InvalidSearchControlsException if cons contains invalid
+ * @exception InvalidSearchControlsException if cons contains invalid
* settings
- * @exception InvalidSearchFilterException if filterExpr with filterArgs
+ * @exception InvalidSearchFilterException if filterExpr with filterArgs
* represents an invalid search filter
* @exception NamingException if a naming exception is encountered
*/
- public NamingEnumeration search(String name, String filterExpr,
+ public NamingEnumeration search(String name, String filterExpr,
Object[] filterArgs, SearchControls cons)
throws NamingException {
return null;
@@ -769,46 +771,46 @@
*/
protected String normalize(String path) {
- String normalized = path;
+ String normalized = path;
- // Normalize the slashes and add leading slash if necessary
- if (normalized.indexOf('\\') >= 0)
- normalized = normalized.replace('\\', '/');
- if (!normalized.startsWith("/"))
- normalized = "/" + normalized;
-
- // Resolve occurrences of "//" in the normalized path
- while (true) {
- int index = normalized.indexOf("//");
- if (index < 0)
- break;
- normalized = normalized.substring(0, index) +
- normalized.substring(index + 1);
- }
-
- // Resolve occurrences of "/./" in the normalized path
- while (true) {
- int index = normalized.indexOf("/./");
- if (index < 0)
- break;
- normalized = normalized.substring(0, index) +
- normalized.substring(index + 2);
- }
-
- // Resolve occurrences of "/../" in the normalized path
- while (true) {
- int index = normalized.indexOf("/../");
- if (index < 0)
- break;
- if (index == 0)
- return (null); // Trying to go outside our context
- int index2 = normalized.lastIndexOf('/', index - 1);
- normalized = normalized.substring(0, index2) +
- normalized.substring(index + 3);
- }
+ // Normalize the slashes and add leading slash if necessary
+ if (normalized.indexOf('\\') >= 0)
+ normalized = normalized.replace('\\', '/');
+ if (!normalized.startsWith("/"))
+ normalized = "/" + normalized;
+
+ // Resolve occurrences of "//" in the normalized path
+ while (true) {
+ int index = normalized.indexOf("//");
+ if (index < 0)
+ break;
+ normalized = normalized.substring(0, index) +
+ normalized.substring(index + 1);
+ }
+
+ // Resolve occurrences of "/./" in the normalized path
+ while (true) {
+ int index = normalized.indexOf("/./");
+ if (index < 0)
+ break;
+ normalized = normalized.substring(0, index) +
+ normalized.substring(index + 2);
+ }
+
+ // Resolve occurrences of "/../" in the normalized path
+ while (true) {
+ int index = normalized.indexOf("/../");
+ if (index < 0)
+ break;
+ if (index == 0)
+ return (null); // Trying to go outside our context
+ int index2 = normalized.lastIndexOf('/', index - 1);
+ normalized = normalized.substring(0, index2) +
+ normalized.substring(index + 3);
+ }
- // Return the normalized path that we have completed
- return (normalized);
+ // Return the normalized path that we have completed
+ return (normalized);
}
@@ -847,7 +849,7 @@
String absPath = normalize(fileAbsPath);
if (canPath != null)
canPath = normalize(canPath);
- if ((absoluteBase.length() < absPath.length())
+ if ((absoluteBase.length() < absPath.length())
&& (absoluteBase.length() < canPath.length())) {
absPath = absPath.substring(absoluteBase.length() + 1);
if ((canPath == null) || (absPath == null))
@@ -872,7 +874,7 @@
/**
* List the resources which are members of a collection.
- *
+ *
* @param file Collection
* @return Vector containg NamingEntry objects
*/
@@ -882,6 +884,14 @@
if (!file.isDirectory())
return entries;
String[] names = file.list();
+ if (names==null) {
+ /* Some IO error occurred such as bad file permissions.
+ Prevent a NPE with Arrays.sort(names) */
+ log.warn(sm.getString("fileResources.listingNull",
+ file.getAbsolutePath()));
+ return entries;
+ }
+
Arrays.sort(names); // Sort alphabetically
if (names == null)
return entries;
@@ -916,37 +926,37 @@
* to the file right away (which would put a lock on the file).
*/
protected class FileResource extends Resource {
-
-
+
+
// -------------------------------------------------------- Constructor
public FileResource(File file) {
this.file = file;
}
-
-
+
+
// --------------------------------------------------- Member Variables
-
-
+
+
/**
* Associated file object.
*/
protected File file;
-
-
+
+
/**
* File length.
*/
protected long length = -1L;
-
-
+
+
// --------------------------------------------------- Resource Methods
-
-
+
+
/**
* Content accessor.
- *
+ *
* @return InputStream
*/
public InputStream streamContent()
@@ -956,8 +966,8 @@
}
return super.streamContent();
}
-
-
+
+
}
@@ -965,8 +975,8 @@
/**
- * This specialized resource attribute implementation does some lazy
- * reading (to speed up simple checks, like checking the last modified
+ * This specialized resource attribute implementation does some lazy
+ * reading (to speed up simple checks, like checking the last modified
* date).
*/
protected class FileResourceAttributes extends ResourceAttributes {
@@ -978,19 +988,19 @@
public FileResourceAttributes(File file) {
this.file = file;
}
-
+
// --------------------------------------------------- Member Variables
-
-
+
+
protected File file;
-
-
+
+
protected boolean accessed = false;
-
-
+
+
// ----------------------------------------- ResourceAttributes Methods
-
-
+
+
/**
* Is collection.
*/
@@ -1001,11 +1011,11 @@
}
return super.isCollection();
}
-
-
+
+
/**
* Get content length.
- *
+ *
* @return content length value
*/
public long getContentLength() {
@@ -1014,11 +1024,11 @@
contentLength = file.length();
return contentLength;
}
-
-
+
+
/**
* Get creation time.
- *
+ *
* @return creation time value
*/
public long getCreation() {
@@ -1027,11 +1037,11 @@
creation = file.lastModified();
return creation;
}
-
-
+
+
/**
* Get creation date.
- *
+ *
* @return Creation date value
*/
public Date getCreationDate() {
@@ -1040,11 +1050,11 @@
}
return super.getCreationDate();
}
-
-
+
+
/**
* Get last modified time.
- *
+ *
* @return lastModified time value
*/
public long getLastModified() {
@@ -1053,11 +1063,11 @@
lastModified = file.lastModified();
return lastModified;
}
-
-
+
+
/**
* Get lastModified date.
- *
+ *
* @return LastModified date value
*/
public Date getLastModifiedDate() {
@@ -1066,11 +1076,11 @@
}
return super.getLastModifiedDate();
}
-
-
+
+
/**
* Get name.
- *
+ *
* @return Name value
*/
public String getName() {
@@ -1078,11 +1088,11 @@
name = file.getName();
return name;
}
-
-
+
+
/**
* Get resource type.
- *
+ *
* @return String resource type
*/
public String getResourceType() {
@@ -1092,8 +1102,8 @@
}
return super.getResourceType();
}
-
-
+
+
}
1.2 +1 -0
jakarta-tomcat-catalina/catalina/src/share/org/apache/naming/resources/LocalStrings.properties
Index: LocalStrings.properties
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/naming/resources/LocalStrings.properties,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- LocalStrings.properties 18 Jul 2002 16:47:33 -0000 1.1
+++ LocalStrings.properties 2 Jul 2004 16:25:31 -0000 1.2
@@ -1,4 +1,5 @@
fileResources.base=Document base {0} does not exist or is not a readable directory
+fileResources.listingNull=Could not get dir listing for {0}
warResources.notWar=Doc base must point to a WAR file
warResources.invalidWar=Invalid or unreadable WAR file : {0}
jarResources.syntax=Document base {0} must start with 'jar:' and end with '!/'
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]