Author: joehni
Date: Thu Feb 21 11:45:46 2013
New Revision: 1448606

URL: http://svn.apache.org/r1448606
Log:
Add support for FTPS command to set the DataChannelProtectionLevel (VFS-412).

Added:
    
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsDataChannelProtectionLevel.java
   (with props)
Modified:
    
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/Resources.properties
    
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpClientFactory.java
    
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsClientFactory.java
    
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsFileSystemConfigBuilder.java
    
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/AbstractFtpsProviderTestCase.java
    
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/FtpsProviderExplicitTestCase.java
    
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/FtpsProviderImplicitTestCase_Disabled.java
    commons/proper/vfs/trunk/pom.xml
    commons/proper/vfs/trunk/src/changes/changes.xml

Modified: 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/Resources.properties
URL: 
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/Resources.properties?rev=1448606&r1=1448605&r2=1448606&view=diff
==============================================================================
--- 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/Resources.properties
 (original)
+++ 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/Resources.properties
 Thu Feb 21 11:45:46 2013
@@ -234,6 +234,9 @@ vfs.provider.ftp/output-error.debug=Cant
 vfs.provider.ftp/rename-file.error=Could not rename FTP file "{0}" to "{1}".
 vfs.provider.ftp/set-file-type.error=Could not set the file type to "{0}".
 
+# FTPS Provider
+vfs.provider.ftps/data-channel.level=Failed to setup secure data channel level 
"{0}".
+
 # SFTP Provider
 vfs.provider.sftp/change-work-directory-back.error=Could not change back to 
work directory "{0}".
 vfs.provider.sftp/change-work-directory.error=Could not change to work 
directory "{0}".

Modified: 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpClientFactory.java
URL: 
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpClientFactory.java?rev=1448606&r1=1448605&r2=1448606&view=diff
==============================================================================
--- 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpClientFactory.java
 (original)
+++ 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftp/FtpClientFactory.java
 Thu Feb 21 11:45:46 2013
@@ -72,6 +72,12 @@ public final class FtpClientFactory
                {
                        return new FTPClient();
                }
+
+               @Override
+               protected void setupOpenConnection(final FTPClient client, 
final FileSystemOptions fileSystemOptions)
+               {
+                       // nothing to do for FTP
+               }
     }
     
     public static abstract class ConnectionFactory<C extends FTPClient, B 
extends FtpFileSystemConfigBuilder> {
@@ -204,7 +210,8 @@ public final class FtpClientFactory
                        {
                            client.enterLocalPassiveMode();
                        }
-       
+                       
+                       setupOpenConnection(client, fileSystemOptions);
                    }
                    catch (final IOException e)
                    {
@@ -223,7 +230,8 @@ public final class FtpClientFactory
                }
            }
 
-               protected abstract C createClient(final FileSystemOptions 
fileSystemOptions) throws FileSystemException;
+               protected abstract C createClient(FileSystemOptions 
fileSystemOptions) throws FileSystemException;
+               protected abstract void setupOpenConnection(C client, 
FileSystemOptions fileSystemOptions) throws IOException;
        
            private void configureClient(final FileSystemOptions 
fileSystemOptions, final C client)
            {

Modified: 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsClientFactory.java
URL: 
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsClientFactory.java?rev=1448606&r1=1448605&r2=1448606&view=diff
==============================================================================
--- 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsClientFactory.java
 (original)
+++ 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsClientFactory.java
 Thu Feb 21 11:45:46 2013
@@ -17,6 +17,9 @@
 package org.apache.commons.vfs2.provider.ftps;
 
 
+import java.io.IOException;
+
+import javax.net.ssl.SSLException;
 import javax.net.ssl.TrustManager;
 
 import org.apache.commons.net.ftp.FTPSClient;
@@ -84,5 +87,21 @@ public final class FtpsClientFactory
                        client.setTrustManager(trustManager);
                return client;
                }
+
+               @Override
+               protected void setupOpenConnection(final FTPSClient client, 
final FileSystemOptions fileSystemOptions)
+                       throws IOException
+               {
+                       final FtpsDataChannelProtectionLevel level = 
builder.getDataChannelProtectionLevel(fileSystemOptions);
+                       if (level != null) {
+                               // '0' means streaming, that's what we do!
+                               try {
+                                       client.execPBSZ(0);
+                                       client.execPROT(level.name());
+                               } catch (final SSLException e) {
+                                       throw new 
FileSystemException("vfs.provider.ftps/data-channel.level", e, 
level.toString());
+                               }
+                       }
+               }
     }
 }

Added: 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsDataChannelProtectionLevel.java
URL: 
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsDataChannelProtectionLevel.java?rev=1448606&view=auto
==============================================================================
--- 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsDataChannelProtectionLevel.java
 (added)
+++ 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsDataChannelProtectionLevel.java
 Thu Feb 21 11:45:46 2013
@@ -0,0 +1,27 @@
+/*
+ * 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.vfs2.provider.ftps;
+
+/**
+ * Protection level of the data channel in a FTPS communication.
+ *
+ * @see <a href="http://tools.ietf.org/html/rfc2228#section-3";>RFC 2228, 
section 3</a>
+ * @since 2.1
+ */
+public enum FtpsDataChannelProtectionLevel {
+       C, S, E, P
+}

Propchange: 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsDataChannelProtectionLevel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsDataChannelProtectionLevel.java
------------------------------------------------------------------------------
    svn:keywords = Author Id HeadURL Revision

Modified: 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsFileSystemConfigBuilder.java
URL: 
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsFileSystemConfigBuilder.java?rev=1448606&r1=1448605&r2=1448606&view=diff
==============================================================================
--- 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsFileSystemConfigBuilder.java
 (original)
+++ 
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/ftps/FtpsFileSystemConfigBuilder.java
 Thu Feb 21 11:45:46 2013
@@ -32,6 +32,7 @@ public final class FtpsFileSystemConfigB
         new FtpsFileSystemConfigBuilder();
 
     private static final String FTPS_TYPE = _PREFIX + ".FTPS_TYPE";
+    private static final String PROT = _PREFIX + ".PROT";
 
     /**
      * FTPS implicit file type.
@@ -43,10 +44,6 @@ public final class FtpsFileSystemConfigB
      */
     public static final String FTPS_TYPE_EXPLICIT = "explicit";
 
-    // For VFS-412
-    // private static final String PROT =
-    // FtpsFileSystemConfigBuilder.class.getName() + ".PROT";
-
     private FtpsFileSystemConfigBuilder()
     {
         super("ftps.");
@@ -90,31 +87,29 @@ public final class FtpsFileSystemConfigB
         return getString(opts, FTPS_TYPE, 
FtpsFileSystemConfigBuilder.FTPS_TYPE_EXPLICIT);
     }
 
-
-// For VFS-412
-//    /**
-//     * Gets the data channel protection level (PROT).
-//     *
-//     * @param opts The FileSystemOptions.
-//     * @return The PROT value.
-//     * @see org.apache.commons.net.ftp.FTPSClient#execPROT(String)
-//     * @since 2.1
-//     */
-//    public String getDataChannelProtectionLevel(FileSystemOptions opts)
-//    {
-//        return (String) getParam(opts, PROT);
-//    }
-//
-//    /**
-//     * Sets the data channel protection level (PROT).
-//     *
-//     * @param opts  The FileSystemOptions.
-//     * @param prot The PROT value, {@code null} has no effect.
-//     * @see org.apache.commons.net.ftp.FTPSClient#execPROT(String)
-//     * @since 2.1
-//     */
-//    public void setDataChannelProtectionLevel(FileSystemOptions opts, String 
prot)
-//    {
-//        setParam(opts, PROT, prot);
-//    }
+       /**
+        * Gets the data channel protection level (PROT).
+        * 
+        * @param opts The FileSystemOptions.
+        * @return The PROT value.
+        * @see org.apache.commons.net.ftp.FTPSClient#execPROT(String)
+        * @since 2.1
+        */
+       public FtpsDataChannelProtectionLevel 
getDataChannelProtectionLevel(final FileSystemOptions opts)
+       {
+               return (FtpsDataChannelProtectionLevel)getParam(opts, PROT);
+       }
+
+       /**
+        * Sets the data channel protection level (PROT).
+        * 
+        * @param opts The FileSystemOptions.
+        * @param prot The PROT value, {@code null} has no effect.
+        * @see org.apache.commons.net.ftp.FTPSClient#execPROT(String)
+        * @since 2.1
+        */
+       public void setDataChannelProtectionLevel(final FileSystemOptions opts, 
final FtpsDataChannelProtectionLevel prot)
+       {
+               setParam(opts, PROT, prot);
+       }
 }

Modified: 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/AbstractFtpsProviderTestCase.java
URL: 
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/AbstractFtpsProviderTestCase.java?rev=1448606&r1=1448605&r2=1448606&view=diff
==============================================================================
--- 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/AbstractFtpsProviderTestCase.java
 (original)
+++ 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/AbstractFtpsProviderTestCase.java
 Thu Feb 21 11:45:46 2013
@@ -196,16 +196,17 @@ abstract class AbstractFtpsProviderTestC
         if (fileSystemOptions == null)
         {
             fileSystemOptions = new FileSystemOptions();
-            final FtpsFileSystemConfigBuilder builder = 
FtpsFileSystemConfigBuilder.getInstance();
-            builder.setConnectTimeout(fileSystemOptions, 
Integer.valueOf(1000));
-            builder.setDataTimeout(fileSystemOptions, Integer.valueOf(2000));
-            builder.setFtpsType(fileSystemOptions, isImplicit() 
-               ? FtpsFileSystemConfigBuilder.FTPS_TYPE_IMPLICIT 
-               : FtpsFileSystemConfigBuilder.FTPS_TYPE_EXPLICIT);
+            setupOptions(FtpsFileSystemConfigBuilder.getInstance());
         }
         return fileSystemOptions;
     }
 
+       protected void setupOptions(final FtpsFileSystemConfigBuilder builder)
+       {
+               builder.setConnectTimeout(fileSystemOptions, 
Integer.valueOf(1000));
+               builder.setDataTimeout(fileSystemOptions, 
Integer.valueOf(2000));
+       }
+
     /**
      * Prepares the file system manager.
      */

Modified: 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/FtpsProviderExplicitTestCase.java
URL: 
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/FtpsProviderExplicitTestCase.java?rev=1448606&r1=1448605&r2=1448606&view=diff
==============================================================================
--- 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/FtpsProviderExplicitTestCase.java
 (original)
+++ 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/FtpsProviderExplicitTestCase.java
 Thu Feb 21 11:45:46 2013
@@ -16,6 +16,9 @@
  */
 package org.apache.commons.vfs2.provider.ftps.test;
 
+import org.apache.commons.vfs2.provider.ftps.FtpsDataChannelProtectionLevel;
+import org.apache.commons.vfs2.provider.ftps.FtpsFileSystemConfigBuilder;
+
 import junit.framework.Test;
 
 /**
@@ -29,6 +32,14 @@ public class FtpsProviderExplicitTestCas
                return false;
        }
 
+       @Override
+       protected void setupOptions(final FtpsFileSystemConfigBuilder builder)
+       {
+               super.setupOptions(builder);
+               builder.setDataChannelProtectionLevel(fileSystemOptions, 
FtpsDataChannelProtectionLevel.P);
+               builder.setFtpsType(fileSystemOptions, 
FtpsFileSystemConfigBuilder.FTPS_TYPE_EXPLICIT);
+       }
+
        /**
      * Creates the test suite for the ftps file system.
      */

Modified: 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/FtpsProviderImplicitTestCase_Disabled.java
URL: 
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/FtpsProviderImplicitTestCase_Disabled.java?rev=1448606&r1=1448605&r2=1448606&view=diff
==============================================================================
--- 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/FtpsProviderImplicitTestCase_Disabled.java
 (original)
+++ 
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ftps/test/FtpsProviderImplicitTestCase_Disabled.java
 Thu Feb 21 11:45:46 2013
@@ -16,6 +16,8 @@
  */
 package org.apache.commons.vfs2.provider.ftps.test;
 
+import org.apache.commons.vfs2.provider.ftps.FtpsFileSystemConfigBuilder;
+
 import junit.framework.Test;
 
 /**
@@ -33,6 +35,13 @@ public class FtpsProviderImplicitTestCas
                return true;
        }
 
+       @Override
+       protected void setupOptions(final FtpsFileSystemConfigBuilder builder)
+       {
+               super.setupOptions(builder);
+               builder.setFtpsType(fileSystemOptions, 
FtpsFileSystemConfigBuilder.FTPS_TYPE_IMPLICIT);
+       }
+
        /**
      * Creates the test suite for the ftps file system.
      */

Modified: commons/proper/vfs/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/pom.xml?rev=1448606&r1=1448605&r2=1448606&view=diff
==============================================================================
--- commons/proper/vfs/trunk/pom.xml (original)
+++ commons/proper/vfs/trunk/pom.xml Thu Feb 21 11:45:46 2013
@@ -121,6 +121,10 @@
       <name>Dave Marion</name>
       <email>dlmarion -at- apache.org</email>
     </contributor>    
+    <contributor>
+      <name>Jose Juan Montiel</name>
+      <email>josejuan.montiel -at- gmail.com</email>
+    </contributor>    
   </contributors>
 
   <properties>

Modified: commons/proper/vfs/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/src/changes/changes.xml?rev=1448606&r1=1448605&r2=1448606&view=diff
==============================================================================
--- commons/proper/vfs/trunk/src/changes/changes.xml (original)
+++ commons/proper/vfs/trunk/src/changes/changes.xml Thu Feb 21 11:45:46 2013
@@ -26,6 +26,9 @@
 <!--       <action issue="VFS-443" dev="ggregory" type="update" 
due-to="nickallen"> -->
 <!--           [Local] Need an easy way to convert from a FileObject to a 
File. -->
 <!--       </action> -->
+      <action issue="VFS-412" dev="joehni" type="add" due-to="Jose Juan 
Montiel">
+        Add support for FTPS command to set the DataChannelProtectionLevel.
+      </action>
       <action issue="VFS-459" dev="joehni" type="update">
         Sent FTP/FTPS commands and the received answer is logged at debug 
level.
       </action>


Reply via email to