Author: lukaszlenart Date: Wed May 5 16:25:09 2010 New Revision: 941368 URL: http://svn.apache.org/viewvc?rev=941368&view=rev Log: Solved WW-3250 - added wildcard support for Content type and test case
Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java?rev=941368&r1=941367&r2=941368&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java Wed May 5 16:25:09 2010 @@ -226,6 +226,7 @@ public class FileUploadInterceptor exten /* (non-Javadoc) * @see com.opensymphony.xwork2.interceptor.Interceptor#intercept(com.opensymphony.xwork2.ActionInvocation) */ + public String intercept(ActionInvocation invocation) throws Exception { ActionContext ac = invocation.getInvocationContext(); @@ -243,7 +244,7 @@ public class FileUploadInterceptor exten ValidationAware validation = null; Object action = invocation.getAction(); - + if (action instanceof ValidationAware) { validation = (ValidationAware) action; } @@ -323,7 +324,7 @@ public class FileUploadInterceptor exten if ((currentFile != null) && currentFile.isFile()) { if (currentFile.delete() == false) { - LOG.warn("Resource Leaking: Could not remove uploaded file '"+currentFile.getCanonicalPath()+"'."); + LOG.warn("Resource Leaking: Could not remove uploaded file '" + currentFile.getCanonicalPath() + "'."); } } } @@ -369,7 +370,7 @@ public class FileUploadInterceptor exten } LOG.warn(errMsg); - } else if ((! allowedExtensionsSet.isEmpty()) && (!hasAllowedExtension(allowedExtensionsSet, filename))) { + } else if ((!allowedExtensionsSet.isEmpty()) && (!hasAllowedExtension(allowedExtensionsSet, filename))) { String errMsg = getTextMessage(action, "struts.messages.error.file.extension.not.allowed", new Object[]{inputName, filename, file.getName(), contentType}, locale); if (validation != null) { validation.addFieldError(inputName, errMsg); @@ -409,7 +410,43 @@ public class FileUploadInterceptor exten * @return true if itemCollection contains the item, false otherwise. */ private boolean containsItem(Collection<String> itemCollection, String item) { - return itemCollection.contains(item.toLowerCase()); + for (String pattern : itemCollection) + if (matchesWildcard(pattern, item)) + return true; + return false; + } + + private boolean matchesWildcard(String pattern, String text) { + text += '\0'; + pattern += '\0'; + + int N = pattern.length(); + + boolean[] states = new boolean[N + 1]; + boolean[] old = new boolean[N + 1]; + old[0] = true; + + for (int i = 0; i < text.length(); i++) { + char c = text.charAt(i); + states = new boolean[N + 1]; + for (int j = 0; j < N; j++) { + char p = pattern.charAt(j); + + if (old[j] && (p == '*')) + old[j + 1] = true; + + if (old[j] && (p == c)) + states[j + 1] = true; + if (old[j] && (p == '?')) + states[j + 1] = true; + if (old[j] && (p == '*')) + states[j] = true; + if (old[j] && (p == '*')) + states[j + 1] = true; + } + old = states; + } + return states[N]; } private boolean isNonEmpty(Object[] objArray) { @@ -425,15 +462,15 @@ public class FileUploadInterceptor exten private String getTextMessage(String messageKey, Object[] args, Locale locale) { return getTextMessage(null, messageKey, args, locale); } - + private String getTextMessage(Object action, String messageKey, Object[] args, Locale locale) { if (args == null || args.length == 0) { - if ( action != null && useActionMessageBundle) { + if (action != null && useActionMessageBundle) { return LocalizedTextUtil.findText(action.getClass(), messageKey, locale); } - return LocalizedTextUtil.findText(this.getClass(), messageKey, locale); + return LocalizedTextUtil.findText(this.getClass(), messageKey, locale); } else { - if ( action != null && useActionMessageBundle) { + if (action != null && useActionMessageBundle) { return LocalizedTextUtil.findText(action.getClass(), messageKey, locale, DEFAULT_MESSAGE, args); } return LocalizedTextUtil.findText(this.getClass(), messageKey, locale, DEFAULT_MESSAGE, args); Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java?rev=941368&r1=941367&r2=941368&view=diff ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java Wed May 5 16:25:09 2010 @@ -82,6 +82,26 @@ public class FileUploadInterceptorTest e assertTrue(validation.hasErrors()); } + + public void testAcceptFileWithWildcardContent() throws Exception { + interceptor.setAllowedTypes("text/*"); + + ValidationAwareSupport validation = new ValidationAwareSupport(); + boolean ok = interceptor.acceptFile(null, new File(""), "filename.txt", "text/plain", "inputName", validation, Locale.getDefault()); + + assertTrue(ok); + assertTrue(validation.getFieldErrors().isEmpty()); + assertFalse(validation.hasErrors()); + + interceptor.setAllowedTypes("text/h*"); + validation = new ValidationAwareSupport(); + boolean notOk = interceptor.acceptFile(null, new File(""), "filename.html", "text/plain", "inputName", validation, Locale.getDefault()); + + assertFalse(notOk); + assertFalse(validation.getFieldErrors().isEmpty()); + assertTrue(validation.hasErrors()); + } + public void testAcceptFileWithoutEmptyExtensions() throws Exception { interceptor.setAllowedExtensions(".txt");