Author: joehni
Date: Sun Mar 22 19:59:51 2009
New Revision: 757246

URL: http://svn.apache.org/viewvc?rev=757246&view=rev
Log:
Mask password in URL provided as info to a FileSystemException (VFS-169).

Added:
    
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs/FileSystemExceptionTest.java
   (with props)
Modified:
    
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/FileSystemException.java

Modified: 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/FileSystemException.java
URL: 
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/FileSystemException.java?rev=757246&r1=757245&r2=757246&view=diff
==============================================================================
--- 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/FileSystemException.java
 (original)
+++ 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/FileSystemException.java
 Sun Mar 22 19:59:51 2009
@@ -19,6 +19,8 @@
 import org.apache.commons.vfs.util.Messages;
 
 import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * Thrown for file system errors.
@@ -29,6 +31,9 @@
 public class FileSystemException
     extends IOException
 {
+    private static final Pattern URL_PATTERN = Pattern.compile("[a-z]+://.*");
+    private static final Pattern PASSWORD_PATTERN = 
Pattern.compile(":(?:[^/]+)@");
+
     /**
      * The Throwable that caused this exception to be thrown.
      */
@@ -123,7 +128,14 @@
             this.info = new String[info.length];
             for (int i = 0; i < info.length; i++)
             {
-                this.info[i] = String.valueOf(info[i]);
+                String value = String.valueOf(info[i]);
+                // mask passwords (VFS-169)
+                final Matcher urlMatcher = URL_PATTERN.matcher(value);
+                if (urlMatcher.find()) {
+                    final Matcher pwdMatcher = PASSWORD_PATTERN.matcher(value);
+                    value = pwdMatcher.replaceFirst(":***@");
+                }
+                this.info[i] = value;
             }
         }
         this.code = code;

Added: 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs/FileSystemExceptionTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs/FileSystemExceptionTest.java?rev=757246&view=auto
==============================================================================
--- 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs/FileSystemExceptionTest.java
 (added)
+++ 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs/FileSystemExceptionTest.java
 Sun Mar 22 19:59:51 2009
@@ -0,0 +1,61 @@
+/*
+ * 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.commons.vfs;
+
+import junit.framework.TestCase;
+
+
+/**
+ * Tests the {...@link FileSystemException}.
+ * 
+ * @author J&ouml;rg Schaible
+ */
+public class FileSystemExceptionTest extends TestCase {
+    /**
+     * Tests a {...@link FileSystemException} containing info with a URL 
containing a complete
+     * basic authentication.
+     */
+    public void testMasksPasswordOfUrlsWithBasicAuthentication() {
+        final FileSystemException fse = new FileSystemException(
+            "vfs.provider/rename.error", new String[]{
+                "file://test.bin", "http://foo:b...@junit.org/test.bin"});
+
+        assertEquals("file://test.bin", fse.getInfo()[0]);
+        assertEquals("http://foo:*...@junit.org/test.bin";, fse.getInfo()[1]);
+    }
+
+    /**
+     * Tests a {...@link FileSystemException} containing info with a URL 
containing only the user
+     * information.
+     */
+    public void testDoesNotModifyUrlsWithoutPassword() {
+        final FileSystemException fse = new FileSystemException(
+            "vfs.provider/delete.error", new 
String[]{"http://f...@junit.org/test.bin"});
+        assertEquals("http://f...@junit.org/test.bin";, fse.getInfo()[0]);
+    }
+
+    /**
+     * Tests a {...@link FileSystemException} containing info with a nested 
URL containing a
+     * complete basic authentication.
+     */
+    public void testProperDetectionOfUrl() {
+        final FileSystemException fse = new FileSystemException(
+            "vfs.provider/delete.error", new 
String[]{"zip:http://foo:b...@junit.org/test.bin"});
+        assertEquals("zip:http://foo:*...@junit.org/test.bin";, 
fse.getInfo()[0]);
+    }
+
+}

Propchange: 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs/FileSystemExceptionTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs/FileSystemExceptionTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id HeadURL Revision


Reply via email to