vfs_fruit: add option veto_appledouble
authorRalph Boehme <slow@samba.org>
Sat, 9 May 2015 06:31:24 +0000 (08:31 +0200)
committerRalph Böhme <slow@samba.org>
Tue, 9 Jun 2015 12:48:12 +0000 (14:48 +0200)
vfs_fruit adds a wildcard path "._*" to the vetolist in order to prevent
client access to ._ AppleDouble files created internally by vfs_fruit
for storing the Mac resource fork stream.

Unfortunately there are legitimite use cases where an OS X client may
want to use such filenames, extracting ZIP archives (where the archive
contains ._ files) being one of them.

A possible simple solution to this problem would be to not veto ._ files
in the first place, even though that exposes internally created ._ files
which the client shouldn't be able to access.

Bug: https://bugzilla.samba.org/show_bug.cgi?id=11305

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
Autobuild-User(master): Ralph Böhme <slow@samba.org>
Autobuild-Date(master): Tue Jun  9 14:48:14 CEST 2015 on sn-devel-104

docs-xml/manpages/vfs_fruit.8.xml
source3/modules/vfs_fruit.c

index 4e296a42130f6d6a4c2141579925d76eea0f25bf..e407b54ad1cb7cb798c69e1f118f823349a1837b 100644 (file)
            </listitem>
          </varlistentry>
 
+         <varlistentry>
+           <term>fruit:veto_appledouble = yes | no</term>
+           <listitem>
+             <para>Whether ._ AppleDouble files are vetoed which
+             prevents the client from seing and accessing internal
+             AppleDouble files created by vfs_fruit itself for the
+             purpose of storing a Mac resource fork.</para>
+             <para>Vetoing ._ files may break some applications, eg
+             extracting Mac ZIP archives from Mac clients failes,
+             because they contain ._ files. Setting this option to
+             false will fix this, but the abstraction leak of
+             exposing the internally created ._ files may have other
+             unknown side effects.</para>
+             <para>The default is <emphasis>yes</emphasis>.</para>
+           </listitem>
+         </varlistentry>
+
        </variablelist>
 </refsect1>
 
index 8f582c698dca441633bcf5e620eab15b8804cb0b..2547838c6483a925e5243990b32f726b663879c1 100644 (file)
@@ -126,6 +126,7 @@ struct fruit_config_data {
        bool use_aapl;
        bool readdir_attr_enabled;
        bool unix_info_enabled;
+       bool veto_appledouble;
 
        /*
         * Additional options, all enabled by default,
@@ -1334,6 +1335,11 @@ static int init_fruit_config(vfs_handle_struct *handle)
        }
        config->encoding = (enum fruit_encoding)enumval;
 
+       if (lp_parm_bool(SNUM(handle->conn),
+                        FRUIT_PARAM_TYPE_NAME, "veto_appledouble", true)) {
+               config->veto_appledouble = true;
+       }
+
        if (lp_parm_bool(-1, FRUIT_PARAM_TYPE_NAME, "aapl", true)) {
                config->use_aapl = true;
        }
@@ -2014,26 +2020,6 @@ static int fruit_connect(vfs_handle_struct *handle,
                return rc;
        }
 
-       list = lp_veto_files(talloc_tos(), SNUM(handle->conn));
-
-       if (list) {
-               if (strstr(list, "/" ADOUBLE_NAME_PREFIX "*/") == NULL) {
-                       newlist = talloc_asprintf(
-                               list,
-                               "%s/" ADOUBLE_NAME_PREFIX "*/",
-                               list);
-                       lp_do_parameter(SNUM(handle->conn),
-                                       "veto files",
-                                       newlist);
-               }
-       } else {
-               lp_do_parameter(SNUM(handle->conn),
-                               "veto files",
-                               "/" ADOUBLE_NAME_PREFIX "*/");
-       }
-
-       TALLOC_FREE(list);
-
        rc = init_fruit_config(handle);
        if (rc != 0) {
                return rc;
@@ -2042,6 +2028,28 @@ static int fruit_connect(vfs_handle_struct *handle,
        SMB_VFS_HANDLE_GET_DATA(handle, config,
                                struct fruit_config_data, return -1);
 
+       if (config->veto_appledouble) {
+               list = lp_veto_files(talloc_tos(), SNUM(handle->conn));
+
+               if (list) {
+                       if (strstr(list, "/" ADOUBLE_NAME_PREFIX "*/") == NULL) {
+                               newlist = talloc_asprintf(
+                                       list,
+                                       "%s/" ADOUBLE_NAME_PREFIX "*/",
+                                       list);
+                               lp_do_parameter(SNUM(handle->conn),
+                                               "veto files",
+                                               newlist);
+                       }
+               } else {
+                       lp_do_parameter(SNUM(handle->conn),
+                                       "veto files",
+                                       "/" ADOUBLE_NAME_PREFIX "*/");
+               }
+
+               TALLOC_FREE(list);
+       }
+
        if (config->encoding == FRUIT_ENC_NATIVE) {
                lp_do_parameter(
                        SNUM(handle->conn),