Hi All,
I've found a odd behavior in the method Bundle.getResource(String), the
method is not able to resolve the resource if the reource path contains:
'.' or '..' directory.
I have already patched the:
org.apache.felix.framework.searchpolicy.ContentLoaderImpl.getResource(String)
in order to accept the '..' and '.' path (see attchment).
Can I commit the patch?
Ciao,
Stefano "Kismet" Lenzi
P.S.: As you can see from my patch I do not consider the case when the
URL is encoded.
P.P.S.: Should I report a issue on JIRA?
Index:
src/main/java/org/apache/felix/framework/searchpolicy/ContentLoaderImpl.java
===================================================================
---
src/main/java/org/apache/felix/framework/searchpolicy/ContentLoaderImpl.java
(revision 576472)
+++
src/main/java/org/apache/felix/framework/searchpolicy/ContentLoaderImpl.java
(working copy)
@@ -22,12 +22,18 @@
import java.io.InputStream;
import java.net.URL;
import java.security.ProtectionDomain;
+import java.util.ArrayList;
import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.StringTokenizer;
import java.util.Vector;
import org.apache.felix.framework.Logger;
import org.apache.felix.framework.util.SecureAction;
-import org.apache.felix.moduleloader.*;
+import org.apache.felix.moduleloader.IContent;
+import org.apache.felix.moduleloader.IContentLoader;
+import org.apache.felix.moduleloader.ISearchPolicy;
+import org.apache.felix.moduleloader.IURLPolicy;
public class ContentLoaderImpl implements IContentLoader
{
@@ -129,13 +135,49 @@
public URL getResource(String name)
{
URL url = null;
-
+
+ //TODO Handling encoded URL
+
// Remove leading slash, if present.
if (name.startsWith("/"))
{
name = name.substring(1);
- }
-
+ }
+
+ /*
+ * NORMALIZING PATH:
+ * 1 - Removing /./ path
+ * 2 - Resolving /../ path
+ */
+ StringTokenizer tokenizer = new StringTokenizer(name,"/");
+ ArrayList parts = new ArrayList();
+ while(tokenizer.hasMoreTokens())
+ {
+ String namePart = tokenizer.nextToken();
+ if(namePart.equals("."))
+ {
+ continue;
+ }
+ else if(namePart.equals("..") && parts.size()>=1)
+ {
+ //XXX Should we launch an exception if there
are too many parent directory?!?!?
+ parts.remove(parts.size()-1);
+ }
+ else
+ {
+ parts.add(namePart);
+ }
+ }
+
+ //Rebuilding the path from parts
+ name = "";
+ for (Iterator i = parts.iterator(); i.hasNext();)
+ {
+ String p = (String) i.next();
+ name += "/" + p;
+ }
+ name = name.substring(1);
+
// Check the module class path.
for (int i = 0;
(url == null) &&