Author: markt Date: Wed May 7 13:12:27 2014 New Revision: 1593009 URL: http://svn.apache.org/r1593009 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56451 Revert r1592052 and apply and alternative fix that should have fewer side effects.
Modified: tomcat/tc7.0.x/trunk/java/org/apache/naming/resources/BaseDirContext.java tomcat/tc7.0.x/trunk/test/org/apache/naming/resources/TestNamingContext.java Modified: tomcat/tc7.0.x/trunk/java/org/apache/naming/resources/BaseDirContext.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/naming/resources/BaseDirContext.java?rev=1593009&r1=1593008&r2=1593009&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/naming/resources/BaseDirContext.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/naming/resources/BaseDirContext.java Wed May 7 13:12:27 2014 @@ -181,7 +181,11 @@ public abstract class BaseDirContext imp * Add an alias. */ public void addAlias(String path, BaseDirContext dirContext) { - aliases.put(convertPathToName(path), dirContext); + if (!path.startsWith("/")) { + throw new IllegalArgumentException( + sm.getString("resources.invalidAliasPath", path)); + } + aliases.put(path, dirContext); } @@ -189,21 +193,14 @@ public abstract class BaseDirContext imp * Remove an alias. */ public void removeAlias(String path) { - aliases.remove(convertPathToName(path)); - } - - - private String convertPathToName(String path) { - // Path should have a leading / if (!path.startsWith("/")) { throw new IllegalArgumentException( sm.getString("resources.invalidAliasPath", path)); } - - // Name should not have a leading / - return path.substring(1); + aliases.remove(path); } + /** * Get the current alias configuration in String form. If no aliases are * configured, an empty string will be returned. @@ -220,7 +217,6 @@ public abstract class BaseDirContext imp result.append(','); } Entry<String,BaseDirContext> entry = iter.next(); - result.append('/'); result.append(entry.getKey()); result.append('='); result.append(entry.getValue().getDocBase()); @@ -1656,7 +1652,23 @@ public abstract class BaseDirContext imp private AliasResult findAlias(String name) { AliasResult result = new AliasResult(); - String searchName = name; + // The JNDI resources code mixes names (that don't have leading '/') and + // paths (which do have leading '/'). This code is a little messy but + // the alternative is reviewing the entire o.a.n.resources package for + // the correct use of name vs path and that is very likely to break + // clients (including Tomcat internals and user applications). + String searchName; + boolean slashAppended; + if (name.length() == 0) { + searchName = "/"; + slashAppended = true; + } else if (name.charAt(0) == '/') { + searchName = name; + slashAppended = false; + } else { + searchName = "/" + name; + slashAppended = true; + } result.dirContext = aliases.get(searchName); while (result.dirContext == null) { @@ -1667,8 +1679,13 @@ public abstract class BaseDirContext imp result.dirContext = aliases.get(searchName); } - if (result.dirContext != null) - result.aliasName = name.substring(searchName.length()); + if (result.dirContext != null) { + if (slashAppended) { + result.aliasName = name.substring(searchName.length() - 1); + } else { + result.aliasName = name.substring(searchName.length()); + } + } return result; } Modified: tomcat/tc7.0.x/trunk/test/org/apache/naming/resources/TestNamingContext.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/naming/resources/TestNamingContext.java?rev=1593009&r1=1593008&r2=1593009&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/test/org/apache/naming/resources/TestNamingContext.java (original) +++ tomcat/tc7.0.x/trunk/test/org/apache/naming/resources/TestNamingContext.java Wed May 7 13:12:27 2014 @@ -148,7 +148,7 @@ public class TestNamingContext extends T +",/a2=" + alternate2.getCanonicalPath()); // Check first alias - Object file = ctx.lookup("a1/test1.txt"); + Object file = ctx.lookup("/a1/test1.txt"); Assert.assertNotNull(file); Assert.assertTrue(file instanceof Resource); @@ -168,7 +168,7 @@ public class TestNamingContext extends T assertEquals(foxText, contents); // Check second alias - file = ctx.lookup("a2/test2.txt"); + file = ctx.lookup("/a2/test2.txt"); Assert.assertNotNull(file); Assert.assertTrue(file instanceof Resource); @@ -191,7 +191,7 @@ public class TestNamingContext extends T + ","); // Check first alias - file = ctx.lookup("a1/test1.txt"); + file = ctx.lookup("/a1/test1.txt"); Assert.assertNotNull(file); Assert.assertTrue(file instanceof Resource); @@ -208,7 +208,7 @@ public class TestNamingContext extends T assertEquals(foxText, contents); // Check second alias - file = ctx.lookup("a2/test2.txt"); + file = ctx.lookup("/a2/test2.txt"); Assert.assertNotNull(file); Assert.assertTrue(file instanceof Resource); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org