tests/s3: Test SMB2_FIND_POSIX_INFORMATION dir query
authorDavid Mulder <dmulder@suse.com>
Wed, 15 Jun 2022 21:39:00 +0000 (15:39 -0600)
committerVolker Lendecke <vl@samba.org>
Tue, 29 Nov 2022 10:26:37 +0000 (10:26 +0000)
Signed-off-by: David Mulder <dmulder@suse.com>
Reviewed-by: Volker Lendecke <vl@samba.org>
python/samba/tests/smb3unix.py
selftest/target/Samba3.pm
source3/libsmb/pylibsmb.c

index 514c245515fa9758307f2aa0e82c5b746e027946..a667fcaaed1bfe0cf034e2ed549f55afc717e12a 100644 (file)
 from samba.samba3 import libsmb_samba_internal as libsmb
 from samba import NTSTATUSError,ntstatus
 import samba.tests.libsmb
+from samba.dcerpc import security
+
+def posix_context(mode):
+    return (libsmb.SMB2_CREATE_TAG_POSIX, mode.to_bytes(4, 'little'))
 
 class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
 
@@ -144,3 +148,47 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
 
         finally:
             self.disable_smb3unix()
+
+    def delete_test_file(self, c, fname, mode=0):
+        f,_,cc_out = c.create_ex(fname,
+                        DesiredAccess=security.SEC_STD_ALL,
+                        CreateDisposition=libsmb.FILE_OPEN,
+                        CreateContexts=[posix_context(mode)])
+        c.delete_on_close(f, True)
+        c.close(f)
+
+    def test_posix_query_dir(self):
+        test_files = []
+        try:
+            self.enable_smb3unix()
+
+            c = libsmb.Conn(
+                self.server_ip,
+                "smb3_posix_share",
+                self.lp,
+                self.creds,
+                posix=True)
+            self.assertTrue(c.have_posix())
+
+            for i in range(10):
+                fname = '\\test%d' % i
+                f,_,cc_out = c.create_ex(fname,
+                                CreateDisposition=libsmb.FILE_OPEN_IF,
+                                CreateContexts=[posix_context(0o744)])
+                c.close(f)
+                test_files.append(fname)
+
+            expected_count = len(c.list(''))
+            self.assertNotEqual(expected_count, 0, 'No files were found')
+
+            actual_count = len(c.list('',
+                                info_level=libsmb.SMB2_FIND_POSIX_INFORMATION,
+                                posix=True))
+            self.assertEqual(actual_count, expected_count,
+                             'SMB2_FIND_POSIX_INFORMATION failed to list contents')
+
+        finally:
+            for fname in test_files:
+                self.delete_test_file(c, fname)
+
+            self.disable_smb3unix()
index a2808ffbce86661b1ca2e6790ca0f99b0172ef3d..3ec0776e6541983099cd6a1af4d117de43ddd68b 100755 (executable)
@@ -3078,6 +3078,14 @@ sub provision($$)
        directory mask = 0777
        force directory mode = 0
        vfs objects = xattr_tdb streams_depot
+[smb3_posix_share]
+       vfs objects = fake_acls xattr_tdb streams_depot time_audit full_audit
+       create mask = 07777
+       directory mask = 07777
+       mangled names = no
+       path = $shrdir
+       read only = no
+       guest ok = yes
 [aio]
        copy = durable
        aio read size = 1
index 4cbc425bbedd0f285fd814b28ba1c448c24a448f..e270c4a7f550eee8eb4a58101c1df5e311a0795b 100644 (file)
@@ -2821,6 +2821,13 @@ MODULE_INIT_FUNC(libsmb_samba_cwrapper)
        ADD_STRING(SMB2_CREATE_TAG_APP_INSTANCE_ID);
        ADD_STRING(SVHDX_OPEN_DEVICE_CONTEXT);
        ADD_STRING(SMB2_CREATE_TAG_POSIX);
+       ADD_FLAGS(SMB2_FIND_POSIX_INFORMATION);
+       ADD_FLAGS(FILE_SUPERSEDE);
+       ADD_FLAGS(FILE_OPEN);
+       ADD_FLAGS(FILE_CREATE);
+       ADD_FLAGS(FILE_OPEN_IF);
+       ADD_FLAGS(FILE_OVERWRITE);
+       ADD_FLAGS(FILE_OVERWRITE_IF);
 
        return m;
 }