The branch, master has been updated
       via  7a5228ffce0 CI: smb3unix.py: check basic CreateContexts response
       via  b6301fd0d75 libsmb: add all fields from SMB2_FIND_POSIX_INFORMATION 
in list_posix_helper()
       via  d6c8b709edb libsmb: remove mode from struct file_info
       via  3dc1911f7c4 libsmb: use K format for parsing unsigned long long
       via  f52a025ac48 libsmb: info-level SMB2_FIND_POSIX_INFORMATION doesn't 
return short name
       via  ea89dd0069e libsmb: infer posix context from info_level
       via  6944aa7cafd CI: smb3unix.py: use libsmb.SMB2_FIND_POSIX_INFORMATION
       via  4ff144c247a pylibsmb: add IO_REPARSE_TAG_RESERVED_ZERO
       via  8a8f1f3c6c4 libcli/smb: add IO_REPARSE_TAG_RESERVED_ZERO
      from  9313731e96c ctdb-scripts: Update detect_init_style to use 
/etc/os-release

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 7a5228ffce0fd6700df03812aeb5712e4eb88928
Author: Ralph Boehme <[email protected]>
Date:   Fri Oct 27 18:50:48 2023 +0200

    CI: smb3unix.py: check basic CreateContexts response
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: David Mulder <[email protected]>
    
    Autobuild-User(master): Ralph Böhme <[email protected]>
    Autobuild-Date(master): Tue Oct 31 05:41:17 UTC 2023 on atb-devel-224

commit b6301fd0d75575fd8c19a24c37b2f353dc871fd5
Author: Ralph Boehme <[email protected]>
Date:   Sun Oct 29 15:31:33 2023 +0100

    libsmb: add all fields from SMB2_FIND_POSIX_INFORMATION in 
list_posix_helper()
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: David Mulder <[email protected]>

commit d6c8b709edb9c648934587b7d0f6ef4f06c78c38
Author: Ralph Boehme <[email protected]>
Date:   Sun Oct 29 15:27:08 2023 +0100

    libsmb: remove mode from struct file_info
    
    There's already the "attr" member and this is even used in 
list_posix_helper()
    in pylibsmb.c. While at it, remove the cast in list_posix_helper() by using 
"I"
    instead of "i" format.
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: David Mulder <[email protected]>

commit 3dc1911f7c434de9631ddd28beeac04aa7af9f87
Author: Ralph Boehme <[email protected]>
Date:   Sun Oct 29 14:59:22 2023 +0100

    libsmb: use K format for parsing unsigned long long
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: David Mulder <[email protected]>

commit f52a025ac485694441096edff910da58761df94a
Author: Ralph Boehme <[email protected]>
Date:   Sun Oct 29 14:49:20 2023 +0100

    libsmb: info-level SMB2_FIND_POSIX_INFORMATION doesn't return short name
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: David Mulder <[email protected]>

commit ea89dd0069e7df323208ddea91ea79cdad64700c
Author: Ralph Boehme <[email protected]>
Date:   Sun Oct 29 11:21:47 2023 +0100

    libsmb: infer posix context from info_level
    
    No need for an explcit additional argument, we can just infer this from the
    info_level.
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: David Mulder <[email protected]>

commit 6944aa7cafd536598053812ce6b66b4d8e284859
Author: Ralph Boehme <[email protected]>
Date:   Sun Oct 29 11:09:04 2023 +0100

    CI: smb3unix.py: use libsmb.SMB2_FIND_POSIX_INFORMATION
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: David Mulder <[email protected]>

commit 4ff144c247a8548a47743e197406e844038df1fc
Author: Ralph Boehme <[email protected]>
Date:   Fri Oct 27 18:50:30 2023 +0200

    pylibsmb: add IO_REPARSE_TAG_RESERVED_ZERO
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: David Mulder <[email protected]>

commit 8a8f1f3c6c46d4fa2fe473c93b1c14fae806274e
Author: Ralph Boehme <[email protected]>
Date:   Fri Oct 27 18:50:06 2023 +0200

    libcli/smb: add IO_REPARSE_TAG_RESERVED_ZERO
    
    Signed-off-by: Ralph Boehme <[email protected]>
    Reviewed-by: David Mulder <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 libcli/smb/smb_constants.h     |  1 +
 python/samba/tests/smb3unix.py | 66 +++++++++++++++++++++++++++++++++++++++---
 source3/include/client.h       |  1 -
 source3/libsmb/cli_smb2_fnum.c |  9 +++---
 source3/libsmb/cli_smb2_fnum.h |  3 +-
 source3/libsmb/clilist.c       |  7 ++---
 source3/libsmb/proto.h         |  3 +-
 source3/libsmb/pylibsmb.c      | 45 ++++++++++++++++------------
 8 files changed, 100 insertions(+), 35 deletions(-)


Changeset truncated at 500 lines:

diff --git a/libcli/smb/smb_constants.h b/libcli/smb/smb_constants.h
index 8d3dc998a10..ead047d924f 100644
--- a/libcli/smb/smb_constants.h
+++ b/libcli/smb/smb_constants.h
@@ -607,6 +607,7 @@ enum csc_policy {
  * A few values from [MS-FSCC] 2.1.2.1 Reparse Tags
  */
 
+#define IO_REPARSE_TAG_RESERVED_ZERO 0x00000000
 #define IO_REPARSE_TAG_SYMLINK      0xA000000C
 #define IO_REPARSE_TAG_MOUNT_POINT   0xA0000003
 #define IO_REPARSE_TAG_HSM           0xC0000004
diff --git a/python/samba/tests/smb3unix.py b/python/samba/tests/smb3unix.py
index 7b25c4bcd68..a98109d096b 100644
--- a/python/samba/tests/smb3unix.py
+++ b/python/samba/tests/smb3unix.py
@@ -20,12 +20,21 @@ from samba import NTSTATUSError,ntstatus
 import samba.tests.libsmb
 from samba.dcerpc import security
 from samba.common import get_string
+from samba.dcerpc import smb3posix
+from samba.ndr import ndr_unpack
+from samba.dcerpc.security import dom_sid
+import os
 
 def posix_context(mode):
     return (libsmb.SMB2_CREATE_TAG_POSIX, mode.to_bytes(4, 'little'))
 
 class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
 
+    def setUp(self):
+        super(Smb3UnixTests, self).setUp()
+
+        self.samsid = os.environ["SAMSID"]
+
     def test_negotiate_context_posix(self):
         c = libsmb.Conn(
             self.server_ip,
@@ -119,8 +128,7 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
             self.assertNotEqual(expected_count, 0, 'No files were found')
 
             actual_count = len(c.list('',
-                                info_level=libsmb.SMB2_FIND_POSIX_INFORMATION,
-                                posix=True))
+                                info_level=libsmb.SMB2_FIND_POSIX_INFORMATION))
             self.assertEqual(actual_count-2, expected_count,
                              'SMB2_FIND_POSIX_INFORMATION failed to list 
contents')
 
@@ -239,7 +247,7 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
                                 CreateContexts=[posix_context(perm)])
                 c.close(f)
 
-            res = c.list("", info_level=100, posix=True)
+            res = c.list("", info_level=libsmb.SMB2_FIND_POSIX_INFORMATION)
             found_files = {get_string(i['name']): i['perms'] for i in res}
             for fname, perm in test_files.items():
                 self.assertIn(get_string(fname), found_files.keys(),
@@ -262,7 +270,7 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
             posix=True)
         self.assertTrue(c.have_posix())
 
-        res = c.list("", info_level=100, posix=True)
+        res = c.list("", info_level=libsmb.SMB2_FIND_POSIX_INFORMATION)
         found_files = {get_string(i['name']): i for i in res}
         dotdot = found_files['..']
         self.assertEqual('S-1-0-0', dotdot['owner_sid'],
@@ -271,3 +279,53 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
                          'The group sid for .. was not NULL')
         self.assertEqual(0, dotdot['ino'], 'The ino for .. was not 0')
         self.assertEqual(0, dotdot['dev'], 'The dev for .. was not 0')
+
+    def test_create_context_basic1(self):
+        '''
+        Check basic CreateContexts response
+        '''
+        try:
+            c = libsmb.Conn(
+                self.server_ip,
+                "smb3_posix_share",
+                self.lp,
+                self.creds,
+                posix=True)
+            self.assertTrue(c.have_posix())
+
+            f,_,cc_out = c.create_ex('\\test_create_context_basic1_file',
+                                     DesiredAccess=security.SEC_STD_ALL,
+                                     CreateDisposition=libsmb.FILE_CREATE,
+                                     CreateContexts=[posix_context(0o600)])
+            c.close(f)
+
+            cc = ndr_unpack(smb3posix.smb3_posix_cc_info, cc_out[0][1])
+
+            self.assertEqual(cc.nlinks, 1)
+            self.assertEqual(cc.reparse_tag, 
libsmb.IO_REPARSE_TAG_RESERVED_ZERO)
+            self.assertEqual(cc.posix_perms, 0o600)
+            self.assertEqual(cc.owner, dom_sid(self.samsid + "-1000"))
+            self.assertTrue(str(cc.group).startswith("S-1-22-2-"))
+
+            f,_,cc_out = c.create_ex('\\test_create_context_basic1_dir',
+                                     DesiredAccess=security.SEC_STD_ALL,
+                                     CreateDisposition=libsmb.FILE_CREATE,
+                                     CreateOptions=libsmb.FILE_DIRECTORY_FILE,
+                                     CreateContexts=[posix_context(0o700)])
+
+            c.close(f)
+
+            cc = ndr_unpack(smb3posix.smb3_posix_cc_info, cc_out[0][1])
+
+            # Note: this fails on btrfs which always reports the link
+            # count of directories as one.
+            self.assertEqual(cc.nlinks, 2)
+
+            self.assertEqual(cc.reparse_tag, 
libsmb.IO_REPARSE_TAG_RESERVED_ZERO)
+            self.assertEqual(cc.posix_perms, 0o700)
+            self.assertEqual(cc.owner, dom_sid(self.samsid + "-1000"))
+            self.assertTrue(str(cc.group).startswith("S-1-22-2-"))
+
+        finally:
+            self.delete_test_file(c, '\\test_create_context_basic1_file')
+            self.delete_test_file(c, '\\test_create_context_basic1_dir')
diff --git a/source3/include/client.h b/source3/include/client.h
index 9634166428c..e1a394af4b5 100644
--- a/source3/include/client.h
+++ b/source3/include/client.h
@@ -109,7 +109,6 @@ struct file_info {
        struct timespec ctime_ts;
        char *name;
        char *short_name;
-       uint32_t mode;
        uint32_t reparse_tag;
        dev_t st_ex_dev;
        mode_t st_ex_mode;
diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c
index 2092fc55048..08d95cf3579 100644
--- a/source3/libsmb/cli_smb2_fnum.c
+++ b/source3/libsmb/cli_smb2_fnum.c
@@ -1266,7 +1266,7 @@ static NTSTATUS parse_finfo_posix_info(const uint8_t 
*dir_data,
        finfo->ctime_ts = interpret_long_date(info.change_time);
        finfo->allocated_size = info.allocation_size;
        finfo->size = info.end_of_file;
-       finfo->mode = info.file_attributes;
+       finfo->attr = info.file_attributes;
        finfo->ino = info.inode;
        finfo->st_ex_dev = info.device;
        finfo->st_ex_nlink = info.cc.nlinks;
@@ -1453,8 +1453,7 @@ struct tevent_req *cli_smb2_list_send(
        struct tevent_context *ev,
        struct cli_state *cli,
        const char *pathname,
-       unsigned int info_level,
-       bool posix)
+       unsigned int info_level)
 {
        struct tevent_req *req = NULL, *subreq = NULL;
        struct cli_smb2_list_state *state = NULL;
@@ -1477,7 +1476,9 @@ struct tevent_req *cli_smb2_list_send(
                return tevent_req_post(req, ev);
        }
 
-       if (smbXcli_conn_have_posix(cli->conn) && posix) {
+       if (smbXcli_conn_have_posix(cli->conn) &&
+               info_level == SMB2_FIND_POSIX_INFORMATION)
+       {
                NTSTATUS status;
 
                /* The mode MUST be 0 when opening an existing file/dir, and
diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h
index cde6a3ac333..abac569385d 100644
--- a/source3/libsmb/cli_smb2_fnum.h
+++ b/source3/libsmb/cli_smb2_fnum.h
@@ -106,8 +106,7 @@ struct tevent_req *cli_smb2_list_send(
        struct tevent_context *ev,
        struct cli_state *cli,
        const char *pathname,
-       unsigned int info_level,
-       bool posix);
+       unsigned int info_level);
 NTSTATUS cli_smb2_list_recv(
        struct tevent_req *req,
        TALLOC_CTX *mem_ctx,
diff --git a/source3/libsmb/clilist.c b/source3/libsmb/clilist.c
index 9ef3f73a24a..54b46b09e0e 100644
--- a/source3/libsmb/clilist.c
+++ b/source3/libsmb/clilist.c
@@ -1002,8 +1002,7 @@ struct tevent_req *cli_list_send(TALLOC_CTX *mem_ctx,
                                 struct cli_state *cli,
                                 const char *mask,
                                 uint32_t attribute,
-                                uint16_t info_level,
-                                bool posix)
+                                uint16_t info_level)
 {
        struct tevent_req *req = NULL;
        struct cli_list_state *state;
@@ -1017,7 +1016,7 @@ struct tevent_req *cli_list_send(TALLOC_CTX *mem_ctx,
 
        if (proto >= PROTOCOL_SMB2_02) {
                state->subreq = cli_smb2_list_send(state, ev, cli, mask,
-                                                  info_level, posix);
+                                                  info_level);
                state->recv_fn = cli_smb2_list_recv;
        } else if (proto >= PROTOCOL_LANMAN2) {
                state->subreq = cli_list_trans_send(
@@ -1230,7 +1229,7 @@ NTSTATUS cli_list(struct cli_state *cli,
                        ? SMB_FIND_FILE_BOTH_DIRECTORY_INFO : 
SMB_FIND_INFO_STANDARD;
        }
 
-       req = cli_list_send(frame, ev, cli, mask, attribute, info_level, false);
+       req = cli_list_send(frame, ev, cli, mask, attribute, info_level);
        if (req == NULL) {
                goto fail;
        }
diff --git a/source3/libsmb/proto.h b/source3/libsmb/proto.h
index b5a0311469e..35b6577a4bd 100644
--- a/source3/libsmb/proto.h
+++ b/source3/libsmb/proto.h
@@ -772,8 +772,7 @@ struct tevent_req *cli_list_send(TALLOC_CTX *mem_ctx,
                                 struct cli_state *cli,
                                 const char *mask,
                                 uint32_t attribute,
-                                uint16_t info_level,
-                                bool posix);
+                                uint16_t info_level);
 NTSTATUS cli_list_recv(
        struct tevent_req *req,
        TALLOC_CTX *mem_ctx,
diff --git a/source3/libsmb/pylibsmb.c b/source3/libsmb/pylibsmb.c
index 3063283ecc1..3129a45374a 100644
--- a/source3/libsmb/pylibsmb.c
+++ b/source3/libsmb/pylibsmb.c
@@ -1886,31 +1886,41 @@ static NTSTATUS list_posix_helper(struct file_info 
*finfo,
 {
        PyObject *result = (PyObject *)state;
        PyObject *file = NULL;
-       PyObject *size = NULL;
        int ret;
 
-       size = PyLong_FromUnsignedLongLong(finfo->size);
        /*
         * Build a dictionary representing the file info.
-        * Note: Windows does not always return short_name (so it may be None)
         */
-       file = Py_BuildValue("{s:s,s:i,s:s,s:O,s:l,s:i,s:i,s:i,s:s,s:s}",
+       file = Py_BuildValue("{s:s,s:I,"
+                            "s:K,s:K,"
+                            "s:l,s:l,s:l,s:l,"
+                            "s:i,s:K,s:i,s:i,s:I,"
+                            "s:s,s:s}",
                             "name", finfo->name,
-                            "attrib", (int)finfo->attr,
-                            "short_name", finfo->short_name,
-                            "size", size,
+                            "attrib", finfo->attr,
+
+                            "size", finfo->size,
+                            "allocaction_size", finfo->allocated_size,
+
+                            "btime",
+                            convert_timespec_to_time_t(finfo->btime_ts),
+                            "atime",
+                            convert_timespec_to_time_t(finfo->atime_ts),
                             "mtime",
                             convert_timespec_to_time_t(finfo->mtime_ts),
+                            "ctime",
+                            convert_timespec_to_time_t(finfo->ctime_ts),
+
                             "perms", finfo->st_ex_mode,
                             "ino", finfo->ino,
                             "dev", finfo->st_ex_dev,
+                            "nlink", finfo->st_ex_nlink,
+                            "reparse_tag", finfo->reparse_tag,
+
                             "owner_sid",
                             dom_sid_string(finfo, &finfo->owner_sid),
                             "group_sid",
                             dom_sid_string(finfo, &finfo->group_sid));
-
-       Py_CLEAR(size);
-
        if (file == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
@@ -2006,7 +2016,6 @@ static NTSTATUS do_listing(struct py_cli_state *self,
                           const char *base_dir, const char *user_mask,
                           uint16_t attribute,
                           unsigned int info_level,
-                          bool posix,
                           NTSTATUS (*callback_fn)(struct file_info *,
                                                   const char *, void *),
                           void *priv)
@@ -2032,7 +2041,7 @@ static NTSTATUS do_listing(struct py_cli_state *self,
        dos_format(mask);
 
        req = cli_list_send(NULL, self->ev, self->cli, mask, attribute,
-                           info_level, posix);
+                           info_level);
        if (req == NULL) {
                status = NT_STATUS_NO_MEMORY;
                goto done;
@@ -2062,18 +2071,17 @@ static PyObject *py_cli_list(struct py_cli_state *self,
        char *user_mask = NULL;
        unsigned int attribute = LIST_ATTRIBUTE_MASK;
        unsigned int info_level = 0;
-       bool posix = false;
        NTSTATUS status;
        enum protocol_types proto = smbXcli_conn_protocol(self->cli->conn);
        PyObject *result = NULL;
-       const char *kwlist[] = { "directory", "mask", "attribs", "posix",
+       const char *kwlist[] = { "directory", "mask", "attribs",
                                 "info_level", NULL };
        NTSTATUS (*callback_fn)(struct file_info *, const char *, void *) =
                &list_helper;
 
-       if (!ParseTupleAndKeywords(args, kwds, "z|sIpI:list", kwlist,
+       if (!ParseTupleAndKeywords(args, kwds, "z|sII:list", kwlist,
                                   &base_dir, &user_mask, &attribute,
-                                  &posix, &info_level)) {
+                                  &info_level)) {
                return NULL;
        }
 
@@ -2090,11 +2098,11 @@ static PyObject *py_cli_list(struct py_cli_state *self,
                }
        }
 
-       if (posix) {
+       if (info_level == SMB2_FIND_POSIX_INFORMATION) {
                callback_fn = &list_posix_helper;
        }
        status = do_listing(self, base_dir, user_mask, attribute,
-                           info_level, posix, callback_fn, result);
+                           info_level, callback_fn, result);
 
        if (!NT_STATUS_IS_OK(status)) {
                Py_XDECREF(result);
@@ -2982,6 +2990,7 @@ MODULE_INIT_FUNC(libsmb_samba_cwrapper)
        ADD_FLAGS(SYMLINK_TRUST_UNKNOWN);
        ADD_FLAGS(SYMLINK_TRUST_MASK);
 
+       ADD_FLAGS(IO_REPARSE_TAG_RESERVED_ZERO);
        ADD_FLAGS(IO_REPARSE_TAG_SYMLINK);
        ADD_FLAGS(IO_REPARSE_TAG_MOUNT_POINT);
        ADD_FLAGS(IO_REPARSE_TAG_HSM);


-- 
Samba Shared Repository

Reply via email to