You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by ni...@apache.org on 2006/12/06 06:12:30 UTC

svn commit: r482895 - in /struts/struts1/trunk/taglib/src: main/java/org/apache/struts/taglib/html/HtmlTag.java test/java/org/apache/struts/taglib/html/ test/java/org/apache/struts/taglib/html/TestHtmlTag.java

Author: niallp
Date: Tue Dec  5 21:12:27 2006
New Revision: 482895

URL: http://svn.apache.org/viewvc?view=rev&rev=482895
Log:
STR-2985 - Validate language and country according to RFC2616 in HtmlTag

Added:
    struts/struts1/trunk/taglib/src/test/java/org/apache/struts/taglib/html/
    struts/struts1/trunk/taglib/src/test/java/org/apache/struts/taglib/html/TestHtmlTag.java   (with props)
Modified:
    struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/HtmlTag.java

Modified: struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/HtmlTag.java
URL: http://svn.apache.org/viewvc/struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/HtmlTag.java?view=diff&rev=482895&r1=482894&r2=482895
==============================================================================
--- struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/HtmlTag.java (original)
+++ struts/struts1/trunk/taglib/src/main/java/org/apache/struts/taglib/html/HtmlTag.java Tue Dec  5 21:12:27 2006
@@ -114,8 +114,8 @@
         language = currentLocale.getLanguage();
         country = currentLocale.getCountry();
 
-        boolean validLanguage = ((language != null) && (language.length() > 0));
-        boolean validCountry = country.length() > 0;
+        boolean validLanguage = isValidRfc2616(language);
+        boolean validCountry  = isValidRfc2616(country);
 
         if (this.xhtml) {
             this.pageContext.setAttribute(Globals.XHTML_KEY, "true",
@@ -171,5 +171,26 @@
     public void release() {
         this.xhtml = false;
         this.lang = false;
+    }
+
+    /**
+     * Check whether the value contains valid characters for the
+     * "Accept-Language" header according to RFC 2616 (section 14.4).
+     *
+     * @param value The value to check
+     * @return <code>true</code> if valid, otherwise <code>false</code>
+     */
+    private boolean isValidRfc2616(String value) {
+        if (value == null || value.length() == 0) {
+            return false;
+        }
+        for (int i = 0; i < value.length(); i++) {
+            char c = value.charAt(i);
+            
+            if (!(Character.isLetter(c) || c == '-')) {
+                return false;
+            }
+        }
+        return true;
     }
 }

Added: struts/struts1/trunk/taglib/src/test/java/org/apache/struts/taglib/html/TestHtmlTag.java
URL: http://svn.apache.org/viewvc/struts/struts1/trunk/taglib/src/test/java/org/apache/struts/taglib/html/TestHtmlTag.java?view=auto&rev=482895
==============================================================================
--- struts/struts1/trunk/taglib/src/test/java/org/apache/struts/taglib/html/TestHtmlTag.java (added)
+++ struts/struts1/trunk/taglib/src/test/java/org/apache/struts/taglib/html/TestHtmlTag.java Tue Dec  5 21:12:27 2006
@@ -0,0 +1,189 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.struts.taglib.html;
+
+import java.util.Locale;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.framework.TestCase;
+import org.apache.struts.mock.MockHttpServletRequest;
+import org.apache.struts.mock.MockHttpServletResponse;
+import org.apache.struts.mock.MockPageContext;
+import org.apache.struts.mock.MockServletConfig;
+
+/**
+ * Unit tests for the HtmlTag.
+ */
+public class TestHtmlTag extends TestCase {
+
+    private MockServletConfig       config;
+    private MockHttpServletRequest  request;
+    private MockHttpServletResponse response;
+    private MockPageContext         pageContext;
+    private HtmlTag                 htmlTag;
+
+    /**
+     * Defines the testcase name for JUnit.
+     *
+     * @param theName the testcase's name.
+     */
+    public TestHtmlTag(String theName) {
+        super(theName);
+    }
+
+    /**
+     * Start the tests.
+     *
+     * @param theArgs the arguments. Not used
+     */
+    public static void main(String[] theArgs) {
+        junit.awtui.TestRunner.main(new String[] { TestHtmlTag.class.getName() });
+    }
+
+    /**
+     * @return a test suite (<code>TestSuite</code>) that includes all methods
+     *         starting with "test"
+     */
+    public static Test suite() {
+        // All methods starting with "test" will be executed in the test suite.
+        return new TestSuite(TestHtmlTag.class);
+    }
+
+    /**
+     * Set up mock objects.
+     */
+    public void setUp() {
+        config      = new MockServletConfig();
+        request     = new MockHttpServletRequest();
+        response    = new MockHttpServletResponse();
+        pageContext = new MockPageContext(config, request, response);
+        htmlTag     = new HtmlTag();
+        htmlTag.setPageContext(pageContext);
+    }
+
+    /**
+     * Test the "lang" attribute with valid characters.
+     */
+    public void testValidLangTrue() {
+        
+        // switch to render "lang" attribute
+        htmlTag.setLang(true);
+
+        // Render for Locale.US
+        request.setLocale(Locale.US);
+        assertEquals("render en_US", "<html lang=\"en-US\">", htmlTag.renderHtmlStartElement());
+
+        // Render for Locale.ENGLISH
+        request.setLocale(Locale.ENGLISH);
+        assertEquals("render en", "<html lang=\"en\">", htmlTag.renderHtmlStartElement());
+
+        // Test valid characters
+        request.setLocale(new Locale("abcd-efghijklmnopqrstuvwxyz", "ABCDEFGHIJKLM-NOPQRSTUVWXYZ", ""));
+        assertEquals("valid characters", "<html lang=\"abcd-efghijklmnopqrstuvwxyz-ABCDEFGHIJKLM-NOPQRSTUVWXYZ\">", htmlTag.renderHtmlStartElement());
+
+    }
+
+    /**
+     * Test the "lang" attribute with valid characters.
+     */
+    public void testValidLangFalse() {
+        
+        // switch to NOT render "lang" attribute
+        htmlTag.setLang(false);
+
+        // Ignore for Locale.US
+        request.setLocale(Locale.US);
+        assertEquals("ignore en_US", "<html>", htmlTag.renderHtmlStartElement());
+
+        // Ignore for Locale.ENGLISH
+        request.setLocale(Locale.ENGLISH);
+        assertEquals("ignore en", "<html>", htmlTag.renderHtmlStartElement());
+
+    }
+
+    /**
+     * Test an invalid "language"
+     */
+    public void testInvalidLanguage() {
+        
+        // switch to render "lang" attribute
+        htmlTag.setLang(true);
+
+        // make sure HtmlTag is setup to render "lang" using a valid value
+        request.setLocale(Locale.US);
+        assertEquals("check valid", "<html lang=\"en-US\">", htmlTag.renderHtmlStartElement());
+
+        // Test script injection
+        request.setLocale(new Locale("/><script>alert()</script>", "", ""));
+        assertEquals("invalid <script>", "<html>", htmlTag.renderHtmlStartElement());
+
+        // Test <
+        request.setLocale(new Locale("abc<def", "", ""));
+        assertEquals("invalid LT", "<html>", htmlTag.renderHtmlStartElement());
+
+        // Test >
+        request.setLocale(new Locale("abc>def", "", ""));
+        assertEquals("invalid GT", "<html>", htmlTag.renderHtmlStartElement());
+
+        // Test /
+        request.setLocale(new Locale("abc/def", "", ""));
+        assertEquals("invalid SLASH", "<html>", htmlTag.renderHtmlStartElement());
+
+        // Test &
+        request.setLocale(new Locale("abc&def", "", ""));
+        assertEquals("invalid AMP", "<html>", htmlTag.renderHtmlStartElement());
+
+    }
+
+    /**
+     * Test an invalid "country"
+     */
+    public void testInvalidCountry() {
+        
+        // switch to render "lang" attribute
+        htmlTag.setLang(true);
+
+        // make sure HtmlTag is setup to render "lang" using a valid value
+        request.setLocale(Locale.US);
+        assertEquals("check valid", "<html lang=\"en-US\">", htmlTag.renderHtmlStartElement());
+
+        // Test script injection
+        request.setLocale(new Locale("en", "/><script>alert()</script>", ""));
+        assertEquals("invalid <script>", "<html lang=\"en\">", htmlTag.renderHtmlStartElement());
+
+        // Test <
+        request.setLocale(new Locale("en", "abc<def", ""));
+        assertEquals("invalid LT", "<html lang=\"en\">", htmlTag.renderHtmlStartElement());
+
+        // Test >
+        request.setLocale(new Locale("en", "abc>def", ""));
+        assertEquals("invalid GT", "<html lang=\"en\">", htmlTag.renderHtmlStartElement());
+
+        // Test /
+        request.setLocale(new Locale("en", "abc/def", ""));
+        assertEquals("invalid SLASH", "<html lang=\"en\">", htmlTag.renderHtmlStartElement());
+
+        // Test &
+        request.setLocale(new Locale("en", "abc&def", ""));
+        assertEquals("invalid AMP", "<html lang=\"en\">", htmlTag.renderHtmlStartElement());
+
+    }
+}

Propchange: struts/struts1/trunk/taglib/src/test/java/org/apache/struts/taglib/html/TestHtmlTag.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: struts/struts1/trunk/taglib/src/test/java/org/apache/struts/taglib/html/TestHtmlTag.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL