Author: markt
Date: Fri Oct 28 14:32:44 2011
New Revision: 1190357

URL: http://svn.apache.org/viewvc?rev=1190357&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51744
Throw the correct exception if an application attempts to modify the associated 
JNDI context.
Add an option to the StandardContext that allows exception throwing when an 
application attempts to modify the associated JNDI context to be disabled.

Modified:
    tomcat/tc7.0.x/trunk/   (props changed)
    
tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/NamingContextListener.java
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java
    tomcat/tc7.0.x/trunk/java/org/apache/naming/NamingContext.java
    tomcat/tc7.0.x/trunk/test/org/apache/naming/resources/TestNamingContext.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
    tomcat/tc7.0.x/trunk/webapps/docs/config/context.xml

Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Oct 28 14:32:44 2011
@@ -1 +1 @@
-/tomcat/trunk:1156115,1156171,1156276,1156304,1156519,1156530,1156602,1157015,1157018,1157151,1157198,1157204,1157810,1157832,1157834,1157847,1157908,1157939,1158155,1158160,1158176,1158195,1158198-1158199,1158227,1158331,1158334-1158335,1158426,1160347,1160592,1160611,1160619,1160626,1160639,1160652,1160720-1160721,1160772,1160774,1160776,1161303,1161310,1161322,1161339,1161486,1161540,1161549,1161584,1162082,1162149,1162169,1162721,1162769,1162836,1162932,1163630,1164419,1164438,1164469,1164480,1164567,1165234,1165247-1165248,1165253,1165273,1165282,1165309,1165331,1165338,1165347,1165360-1165361,1165367-1165368,1165602,1165608,1165677,1165693,1165721,1165723,1165728,1165730,1165738,1165746,1165765,1165777,1165918,1165921,1166077,1166150-1166151,1166290,1166366,1166620,1166686,1166693,1166752,1166757,1167368,1167394,1169447,1170647,1171692,1172233-1172234,1172236,1172269,1172278,1172282,1172556,1172610,1172664,1172689,1172711,1173020-1173021,1173082,1173088,1173090,1173096
 
,1173241,1173256,1173288,1173333,1173342,1173461,1173614,1173630,1173659,1173722,1174061,1174239,1174322,1174325,1174329-1174330,1174337-1174339,1174343,1174353,1174799,1174882,1174884,1174983,1175155,1175158,1175167,1175182,1175190,1175201,1175272,1175275,1175283,1175582,1175589-1175590,1175594,1175602,1175613,1175633,1175690,1175713,1175889,1175896,1175907,1176584,1176590,1176799,1177050,1177060,1177125,1177152,1177160,1177245,1177850,1177862,1177978,1178209,1178228,1178233,1178449,1178542,1178681,1178684,1178721,1179268,1179274,1180261,1180865,1180891,1180894,1180907,1181028,1181123,1181125,1181136,1181291,1181743,1182796,1183078,1183105,1183142,1183328,1183339-1183340,1183492-1183494,1183605,1184917,1184919,1185018,1185020,1185200,1185588,1185626,1185756,1185758,1186011,1186042-1186045,1186104,1186123,1186137,1186153,1186254,1186257,1186377-1186379,1186479-1186480,1186712,1186743,1186750,1186763,1186890-1186892,1186894,1186949,1187018,1187027-1187028,1187381,1187755,1187
 
775,1187827,1188301,1188303-1188305,1188399,1188822,1188930-1188931,1189116,1189129,1189183,1189240,1189256,1189386,1189413-1189414,1189477,1189685,1189805,1189857,1189864,1189882,1190034,1190185,1190279
+/tomcat/trunk:1156115,1156171,1156276,1156304,1156519,1156530,1156602,1157015,1157018,1157151,1157198,1157204,1157810,1157832,1157834,1157847,1157908,1157939,1158155,1158160,1158176,1158195,1158198-1158199,1158227,1158331,1158334-1158335,1158426,1160347,1160592,1160611,1160619,1160626,1160639,1160652,1160720-1160721,1160772,1160774,1160776,1161303,1161310,1161322,1161339,1161486,1161540,1161549,1161584,1162082,1162149,1162169,1162721,1162769,1162836,1162932,1163630,1164419,1164438,1164469,1164480,1164567,1165234,1165247-1165248,1165253,1165273,1165282,1165309,1165331,1165338,1165347,1165360-1165361,1165367-1165368,1165602,1165608,1165677,1165693,1165721,1165723,1165728,1165730,1165738,1165746,1165765,1165777,1165918,1165921,1166077,1166150-1166151,1166290,1166366,1166620,1166686,1166693,1166752,1166757,1167368,1167394,1169447,1170647,1171692,1172233-1172234,1172236,1172269,1172278,1172282,1172556,1172610,1172664,1172689,1172711,1173020-1173021,1173082,1173088,1173090,1173096
 
,1173241,1173256,1173288,1173333,1173342,1173461,1173614,1173630,1173659,1173722,1174061,1174239,1174322,1174325,1174329-1174330,1174337-1174339,1174343,1174353,1174799,1174882,1174884,1174983,1175155,1175158,1175167,1175182,1175190,1175201,1175272,1175275,1175283,1175582,1175589-1175590,1175594,1175602,1175613,1175633,1175690,1175713,1175889,1175896,1175907,1176584,1176590,1176799,1177050,1177060,1177125,1177152,1177160,1177245,1177850,1177862,1177978,1178209,1178228,1178233,1178449,1178542,1178681,1178684,1178721,1179268,1179274,1180261,1180865,1180891,1180894,1180907,1181028,1181123,1181125,1181136,1181291,1181743,1182796,1183078,1183105,1183142,1183328,1183339-1183340,1183492-1183494,1183605,1184917,1184919,1185018,1185020,1185200,1185588,1185626,1185756,1185758,1186011,1186042-1186045,1186104,1186123,1186137,1186153,1186254,1186257,1186377-1186379,1186479-1186480,1186712,1186743,1186750,1186763,1186890-1186892,1186894,1186949,1187018,1187027-1187028,1187381,1187755,1187
 
775,1187827,1188301,1188303-1188305,1188399,1188822,1188930-1188931,1189116,1189129,1189183,1189240,1189256,1189386,1189413-1189414,1189477,1189685,1189805,1189857,1189864,1189882,1190034,1190185,1190279,1190339

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/NamingContextListener.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/NamingContextListener.java?rev=1190357&r1=1190356&r2=1190357&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/NamingContextListener.java 
(original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/NamingContextListener.java 
Fri Oct 28 14:32:44 2011
@@ -141,6 +141,13 @@ public class NamingContextListener
     
 
     /**
+     * Determines if an attempt to write to a read-only context results in an
+     * exception or if the request is ignored.
+     */
+    private boolean exceptionOnFailedWrite = true;
+
+
+    /**
      * The string manager for this package.
      */
     protected static final StringManager sm =
@@ -149,6 +156,25 @@ public class NamingContextListener
 
     // ------------------------------------------------------------- Properties
 
+    /**
+     * Returns whether or not an attempt to modify the JNDI context will 
trigger
+     * an exception or if the request will be ignored.
+     */
+    public boolean getExceptionOnFailedWrite() {
+        return exceptionOnFailedWrite;
+    }
+
+
+    /**
+     * Controls whether or not an attempt to modify the JNDI context will
+     * trigger an exception or if the request will be ignored.
+     *
+     * @param exceptionOnFailedWrite    The new value
+     */
+    public void setExceptionOnFailedWrite(boolean exceptionOnFailedWrite) {
+        this.exceptionOnFailedWrite = exceptionOnFailedWrite;
+    }
+
 
     /**
      * Return the "name" property.
@@ -233,6 +259,10 @@ public class NamingContextListener
                 log.debug("Bound " + container );
             }
 
+            // Configure write when read-only behaviour
+            namingContext.setExceptionOnFailedWrite(
+                    getExceptionOnFailedWrite());
+
             // Setting the context in read/write mode
             ContextAccessController.setWritable(getName(), container);
 

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1190357&r1=1190356&r2=1190357&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java Fri 
Oct 28 14:32:44 2011
@@ -859,7 +859,8 @@ public class StandardContext extends Con
 
     private boolean sendRedirectBody = false;
 
-    
+    private boolean jndiExceptionOnFailedWrite = true;
+
     // ----------------------------------------------------- Context Properties
     
     @Override
@@ -2508,6 +2509,26 @@ public class StandardContext extends Con
 
     // ------------------------------------------------------ Public Properties
 
+    /**
+     * Returns whether or not an attempt to modify the JNDI context will 
trigger
+     * an exception or if the request will be ignored.
+     */
+    public boolean getJndiExceptionOnFailedWrite() {
+        return jndiExceptionOnFailedWrite;
+    }
+
+
+    /**
+     * Controls whether or not an attempt to modify the JNDI context will
+     * trigger an exception or if the request will be ignored.
+     *
+     * @param jndiExceptionOnFailedWrite
+     */
+    public void setJndiExceptionOnFailedWrite(
+            boolean jndiExceptionOnFailedWrite) {
+        this.jndiExceptionOnFailedWrite = jndiExceptionOnFailedWrite;
+    }
+
 
     /**
      * Return the Locale to character set mapper class for this Context.
@@ -5076,6 +5097,7 @@ public class StandardContext extends Con
             if (getNamingContextListener() == null) {
                 NamingContextListener ncl = new NamingContextListener();
                 ncl.setName(getNamingContextName());
+                ncl.setExceptionOnFailedWrite(getJndiExceptionOnFailedWrite());
                 addLifecycleListener(ncl);
                 setNamingContextListener(ncl);
             }

Modified: tomcat/tc7.0.x/trunk/java/org/apache/naming/NamingContext.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/naming/NamingContext.java?rev=1190357&r1=1190356&r2=1190357&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/naming/NamingContext.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/naming/NamingContext.java Fri Oct 28 
14:32:44 2011
@@ -123,12 +123,21 @@ public class NamingContext implements Co
     protected String name;
 
 
-    // --------------------------------------------------------- Public Methods
+    /**
+     * Determines if an attempt to write to a read-only context results in an
+     * exception or if the request is ignored.
+     */
+    private boolean exceptionOnFailedWrite = true;
+    public boolean getExceptionOnFailedWrite() {
+        return exceptionOnFailedWrite;
+    }
+    public void setExceptionOnFailedWrite(boolean exceptionOnFailedWrite) {
+        this.exceptionOnFailedWrite = exceptionOnFailedWrite;
+    }
 
 
     // -------------------------------------------------------- Context Methods
 
-
     /**
      * Retrieves the named object. If name is empty, returns a new instance 
      * of this context (which represents the same naming context as this 
@@ -249,10 +258,12 @@ public class NamingContext implements Co
      * @exception NamingException if a naming exception is encountered
      */
     @Override
-    public void unbind(Name name)
-        throws NamingException {
-        checkWritable();
+    public void unbind(Name name) throws NamingException {
         
+        if (!checkWritable()) {
+            return;
+        }
+
         while ((!name.isEmpty()) && (name.get(0).length() == 0))
             name = name.getSuffix(1);
         if (name.isEmpty())
@@ -465,10 +476,11 @@ public class NamingContext implements Co
      * a context, or does not name a context of the appropriate type
      */
     @Override
-    public void destroySubcontext(Name name)
-        throws NamingException {
+    public void destroySubcontext(Name name) throws NamingException {
         
-        checkWritable();
+        if (!checkWritable()) {
+            return;
+        }
         
         while ((!name.isEmpty()) && (name.get(0).length() == 0))
             name = name.getSuffix(1);
@@ -533,13 +545,16 @@ public class NamingContext implements Co
      * @exception NamingException if a naming exception is encountered
      */
     @Override
-    public Context createSubcontext(Name name)
-        throws NamingException {
-        checkWritable();
+    public Context createSubcontext(Name name) throws NamingException {
+        if (!checkWritable()) {
+            return null;
+        }
         
-        Context newContext = new NamingContext(env, this.name);
+        NamingContext newContext = new NamingContext(env, this.name);
         bind(name, newContext);
         
+        newContext.setExceptionOnFailedWrite(getExceptionOnFailedWrite());
+
         return newContext;
     }
 
@@ -744,7 +759,9 @@ public class NamingContext implements Co
      */
     @Override
     public void close() throws NamingException {
-        checkWritable();
+        if (!checkWritable()) {
+            return;
+        }
         env.clear();
     }
 
@@ -866,7 +883,9 @@ public class NamingContext implements Co
     protected void bind(Name name, Object obj, boolean rebind)
         throws NamingException {
         
-        checkWritable();
+        if (!checkWritable()) {
+            return;
+        }
         
         while ((!name.isEmpty()) && (name.get(0).length() == 0))
             name = name.getSuffix(1);
@@ -935,12 +954,16 @@ public class NamingContext implements Co
     /**
      * Throws a naming exception is Context is not writable.
      */
-    protected void checkWritable() 
-        throws NamingException {
-        if (!isWritable())
-            throw new NamingException(sm.getString("namingContext.readOnly"));
+    protected boolean checkWritable() throws NamingException {
+        if (isWritable()) {
+            return true;
+        } else {
+            if (exceptionOnFailedWrite) {
+                throw new javax.naming.OperationNotSupportedException(
+                        sm.getString("namingContext.readOnly"));
+            }
+        }
+        return false;
     }
-
-
 }
 

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=1190357&r1=1190356&r2=1190357&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 
Fri Oct 28 14:32:44 2011
@@ -30,6 +30,7 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
 
@@ -215,7 +216,17 @@ public class TestNamingContext extends T
     }
     
     @Test
-    public void testBug51744() throws Exception {
+    public void testBug51744a() throws Exception {
+        doTestBug51744(true);
+    }
+
+    @Test
+    public void testBug51744b() throws Exception {
+        doTestBug51744(false);
+    }
+
+    private void doTestBug51744(boolean exceptionOnFailedWrite)
+            throws Exception {
         Tomcat tomcat = getTomcatInstance();
         tomcat.enableNaming();
         
@@ -223,6 +234,8 @@ public class TestNamingContext extends T
         StandardContext ctx = (StandardContext)
             tomcat.addContext("", System.getProperty("java.io.tmpdir"));
         
+        ctx.setJndiExceptionOnFailedWrite(exceptionOnFailedWrite);
+
         // Map the test Servlet
         Bug51744Servlet bug51744Servlet = new Bug51744Servlet();
         Tomcat.addServlet(ctx, "bug51744Servlet", bug51744Servlet);
@@ -233,7 +246,10 @@ public class TestNamingContext extends T
         ByteChunk bc = new ByteChunk();
         int rc = getUrl("http://localhost:"; + getPort() + "/", bc, null);
         assertEquals(200, rc);
-        assertEquals(Bug51744Servlet.EXPECTED, bc.toString());
+        assertTrue(bc.toString().contains(Bug51744Servlet.EXPECTED));
+        if (exceptionOnFailedWrite) {
+            assertTrue(bc.toString().contains(Bug51744Servlet.ERROR_MESSAGE));
+        }
     }
 
     public static final class Bug51744Servlet extends HttpServlet {
@@ -241,6 +257,7 @@ public class TestNamingContext extends T
         private static final long serialVersionUID = 1L;
 
         public static final String EXPECTED = "TestValue";
+        public static final String ERROR_MESSAGE = "Error";
 
         @Override
         protected void doGet(HttpServletRequest req, HttpServletResponse resp)
@@ -254,18 +271,13 @@ public class TestNamingContext extends T
                 Context env1 = (Context) ctx1.lookup("java:comp/env");
                 env1.addToEnvironment("TestName", EXPECTED);
 
-                boolean error = false;
+                out.print(env1.getEnvironment().get("TestName"));
+
                 try {
                     env1.close();
                 } catch (NamingException ne) {
-                    error = true;
+                    out.print(ERROR_MESSAGE);
                 }
-                if (!error) {
-                    throw new ServletException(
-                            "No error when one was expected");
-                }
-                
-                out.print(env1.getEnvironment().get("TestName"));
             } catch (NamingException ne) {
                 ne.printStackTrace(out);
             }

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1190357&r1=1190356&r2=1190357&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Fri Oct 28 14:32:44 2011
@@ -152,6 +152,15 @@
         improve start and stop time. Based on patches by Joe Kislo and Felix
         Schumacher. (markt)
       </add>
+      <fix>
+        <bug>51744</bug>: Throw the correct exception if an application 
attempts
+        to modify the associated JNDI context. (markt)
+      </fix>
+      <add>
+        <bug>51744</bug>: Add an option to the StandardContext that allows
+        exception throwing when an application attempts to modify the 
associated
+        JNDI context to be disabled. (markt)
+      </add>
     </changelog>
   </subsection>
   <subsection name="Coyote">

Modified: tomcat/tc7.0.x/trunk/webapps/docs/config/context.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/config/context.xml?rev=1190357&r1=1190356&r2=1190357&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/config/context.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/config/context.xml Fri Oct 28 14:32:44 
2011
@@ -657,6 +657,19 @@
         not specified, the default value of <code>false</code> will be 
used.</p>
       </attribute>
 
+      <attribute name="jndiExceptionOnFailedWrite" required="false">
+        <p>If <code>true</code>, any attempt by an application to modify the
+        provided JNDI context with a call to bind(), unbind(),
+        createSubContext(), destroySubContext() or close() will trigger a
+        <code>javax.naming.OperationNotSupportedException</code> as required by
+        section EE.5.3.4 of the Java EE specification. This exception can be
+        disabled by setting this attribute to true in which case any calls to
+        modify the JNDI context will return <b>without</b> making any changes
+        and methods that return values will return <code>null</code>. If not
+        specified, the specification compliant default of <code>true</code> 
will
+        be used.</p>
+      </attribute>
+
       <attribute name="processTlds" required="false">
         <p>Whether the context should process TLDs on startup.  The default
         is true.  The false setting is intended for special cases



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to