The branch, master has been updated
       via  ecafdcb3914 s3:pylibsmb: allow ImpersonationLevel argument to 
create()
       via  c8a5e89d9f6 s3:libsmb: pass impersonation_level to 
cli_ntcreate_send()
       via  ed0deadf628 s3:libsmb: pass ImpersonationLevel to 
cli_ntcreate1_send()
       via  850aef94dc4 s3:libsmb: pass impersonation_level to 
cli_smb2_create_fnum()
       via  be464c1dc86 s3:libsmb: pass impersonation_level to 
cli_smb2_create_fnum_send()
       via  64e68abdc9e s3:pylibsmb: make use of protocol independent 
cli_read_send/recv in py_cli_read()
       via  3c3b44004fd s3:pylibsmb: make use of protocol independent 
cli_write_send/recv in py_cli_write()
       via  9fb0d8e7e2e s3:libsmb: add comments for cli_write_send/cli_push_send
       via  6a3d2c3345a s3:libsmb: add cli_write_send/recv which work with 
SMB1/2/3
       via  0af6b335448 s3:pylibsmb: make use of PYARG_BYTES_LEN in 
py_cli_write()
       via  60148c9ee14 s3:pylibsmb: make use of PyBytes_FromStringAndSize() in 
py_cli_read()
       via  aaf7aaa6e26 s3:pylibsmb: .get_oplock_break API is dependent on 
multi_threaded=True
       via  fdc62b03ca5 s3:pylibsmb: remember that a connection uses SMB1
       via  790dab571c4 s3:pylibsmb: add force_smb1=True in order to control 
forcing of SMB1
       via  247a71b63ae s3:pylibsmb: add sign=True to require signing
       via  1bccbfcff78 s3:pylibsmb: only use poll_mt backend if 
multi_threaded=True is specified
       via  59cb025e61a s3:pylibsmb: pass self to py_tevent_req_wait_exc()
       via  660b872163c wafsamba: fix pidl dependencies to rebuild on pidl 
changes
      from  57783d6295d pidl: Fix unsigned integer comparison warning

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


- Log -----------------------------------------------------------------
commit ecafdcb39143b6b3a74f2b9d578241a0170f8486
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 7 16:40:10 2018 +0100

    s3:pylibsmb: allow ImpersonationLevel argument to create()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>
    
    Autobuild-User(master): Stefan Metzmacher <[email protected]>
    Autobuild-Date(master): Thu Dec 13 12:35:06 CET 2018 on sn-devel-144

commit c8a5e89d9f6575c4e9eb770997172e9c25f8e9d0
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 7 16:38:57 2018 +0100

    s3:libsmb: pass impersonation_level to cli_ntcreate_send()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit ed0deadf6287c4c56e99503bf78f20db2f297401
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 7 16:35:16 2018 +0100

    s3:libsmb: pass ImpersonationLevel to cli_ntcreate1_send()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit 850aef94dc4d9370d03f18510de93116221a0feb
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 7 16:42:06 2018 +0100

    s3:libsmb: pass impersonation_level to cli_smb2_create_fnum()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit be464c1dc8675f6e362b7a5b51c6776dc682e3b9
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 7 16:32:05 2018 +0100

    s3:libsmb: pass impersonation_level to cli_smb2_create_fnum_send()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit 64e68abdc9e7d991809e6eab57826b4456d8e973
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 7 14:28:04 2018 +0100

    s3:pylibsmb: make use of protocol independent cli_read_send/recv in 
py_cli_read()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit 3c3b44004fd39a890f2bdfadf3ebb68a53f3403f
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 7 14:28:04 2018 +0100

    s3:pylibsmb: make use of protocol independent cli_write_send/recv in 
py_cli_write()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit 9fb0d8e7e2e5c7a9485368f26d2fff05d51f32d8
Author: Tim Beale <[email protected]>
Date:   Tue Dec 11 16:05:43 2018 +1300

    s3:libsmb: add comments for cli_write_send/cli_push_send
    
    Added a code comment highlighting this 2 APIs do similar jobs, and tried
    to explain why you might want to use one over the other.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit 6a3d2c3345a7ed4a9c4c9ad5ce767cc2ffd9413f
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 7 14:26:43 2018 +0100

    s3:libsmb: add cli_write_send/recv which work with SMB1/2/3
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit 0af6b335448f6ee4f4db6aa857666689e87f00ad
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 7 14:04:30 2018 +0100

    s3:pylibsmb: make use of PYARG_BYTES_LEN in py_cli_write()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit 60148c9ee147105b36cbb8164cbb7b1c2249acb8
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 7 13:47:40 2018 +0100

    s3:pylibsmb: make use of PyBytes_FromStringAndSize() in py_cli_read()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit aaf7aaa6e26c62c62650dc01fff902d3a949a315
Author: Tim Beale <[email protected]>
Date:   Tue Dec 4 12:32:58 2018 +1300

    s3:pylibsmb: .get_oplock_break API is dependent on multi_threaded=True
    
    The .get_oplock_break is dependent on the pthread code, which is only
    used when creating a SMB connection with multi_threaded=True.
    
    Add an explicit error to the .get_oplock_break() if someone tries to use
    it in non-multithreaded mode.
    
    Initializing self->oplock_waiter in non-multithreaded mode is similarly
    redundant if the API can never be used.
    
    Pair-Programmed-With: Stefan Metzmacher <[email protected]>
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Tim Beale <[email protected]>
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit fdc62b03ca5eac3f98f0e1f2db45a7df0b29095e
Author: Stefan Metzmacher <[email protected]>
Date:   Tue Dec 4 10:42:55 2018 +0100

    s3:pylibsmb: remember that a connection uses SMB1
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit 790dab571c426abc1004d1c338e0b94382a2a2c0
Author: Stefan Metzmacher <[email protected]>
Date:   Tue Dec 4 10:40:18 2018 +0100

    s3:pylibsmb: add force_smb1=True in order to control forcing of SMB1
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit 247a71b63aea9fe03e4e6ba22102eeb0cd648a2a
Author: Stefan Metzmacher <[email protected]>
Date:   Mon Dec 3 15:42:50 2018 +0100

    s3:pylibsmb: add sign=True to require signing
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit 1bccbfcff78c49c74cf986a8b9e9a33d295d557c
Author: Stefan Metzmacher <[email protected]>
Date:   Mon Dec 3 15:02:06 2018 +0100

    s3:pylibsmb: only use poll_mt backend if multi_threaded=True is specified
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit 59cb025e61abfe28a9d17616d10641cc74975375
Author: Stefan Metzmacher <[email protected]>
Date:   Mon Dec 3 14:37:05 2018 +0100

    s3:pylibsmb: pass self to py_tevent_req_wait_exc()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Tim Beale <[email protected]>
    Reviewed-by: Andrew Bartlett <[email protected]>

commit 660b872163c9aee99627cd2952ac06c8df85cf22
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Nov 23 14:06:52 2018 +0100

    wafsamba: fix pidl dependencies to rebuild on pidl changes
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

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

Summary of changes:
 buildtools/wafsamba/samba_pidl.py           |   4 +-
 examples/fuse/clifuse.c                     |   6 +-
 examples/winexe/winexe.c                    |   3 +
 python/samba/tests/libsmb_samba_internal.py |   4 +-
 source3/libsmb/cli_smb2_fnum.c              |  21 +++-
 source3/libsmb/cli_smb2_fnum.h              |   2 +
 source3/libsmb/clifile.c                    |  12 +-
 source3/libsmb/clireadwrite.c               | 134 ++++++++++++++++++++
 source3/libsmb/clisymlink.c                 |   6 +-
 source3/libsmb/proto.h                      |   8 ++
 source3/libsmb/pylibsmb.c                   | 186 +++++++++++++++++++++-------
 source3/torture/nbench.c                    |   3 +-
 source3/torture/test_chain3.c               |   3 +-
 source3/torture/test_notify.c               |   9 +-
 source3/torture/test_notify_online.c        |   5 +-
 source3/torture/test_oplock_cancel.c        |   2 +-
 source3/torture/torture.c                   |   3 +-
 17 files changed, 346 insertions(+), 65 deletions(-)


Changeset truncated at 500 lines:

diff --git a/buildtools/wafsamba/samba_pidl.py 
b/buildtools/wafsamba/samba_pidl.py
index 1e55892127e..3fecfa90eb9 100644
--- a/buildtools/wafsamba/samba_pidl.py
+++ b/buildtools/wafsamba/samba_pidl.py
@@ -86,8 +86,6 @@ def SAMBA_PIDL(bld, pname, source,
             name       = name,
             samba_type = 'PIDL')
 
-    # prime the list of nodes we are dependent on with the cached pidl sources
-    t.allnodes = pidl_src_nodes
 
     t.env.PIDL_LAUNCH_DIR = bld.srcnode.path_from(bld.bldnode)
     pnode = bld.srcnode.find_resource('pidl/pidl')
@@ -97,6 +95,8 @@ def SAMBA_PIDL(bld, pname, source,
     t.env.IDLSRC = snode.path_from(bld.srcnode)
     t.env.OUTPUTDIR = bld.bldnode.path_from(bld.srcnode) + '/' + 
bld.path.find_dir(output_dir).path_from(bld.srcnode)
 
+    bld.add_manual_dependency(snode, pidl_src_nodes)
+
     if generate_tables and table_header_idx is not None:
         pidl_headers = LOCAL_CACHE(bld, 'PIDL_HEADERS')
         pidl_headers[name] = 
[bld.path.find_or_declare(out_files[table_header_idx])]
diff --git a/examples/fuse/clifuse.c b/examples/fuse/clifuse.c
index 3c7e4982475..b724e642d4b 100644
--- a/examples/fuse/clifuse.c
+++ b/examples/fuse/clifuse.c
@@ -151,7 +151,8 @@ static void cli_ll_create(fuse_req_t freq, fuse_ino_t 
parent, const char *name,
 
        req = cli_smb2_create_fnum_send(
                state, mstate->ev, mstate->cli, state->path,
-               0, FILE_GENERIC_READ|FILE_GENERIC_WRITE, FILE_ATTRIBUTE_NORMAL,
+               0, SMB2_IMPERSONATION_IMPERSONATION,
+               FILE_GENERIC_READ|FILE_GENERIC_WRITE, FILE_ATTRIBUTE_NORMAL,
                FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                FILE_CREATE, FILE_NON_DIRECTORY_FILE);
        if (req == NULL) {
@@ -836,7 +837,8 @@ static void cli_ll_open(fuse_req_t freq, fuse_ino_t ino,
 
        req = cli_smb2_create_fnum_send(
                state, mstate->ev, mstate->cli, istate->path,
-               0, acc, FILE_ATTRIBUTE_NORMAL,
+               0, SMB2_IMPERSONATION_IMPERSONATION,
+               acc, FILE_ATTRIBUTE_NORMAL,
                FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                FILE_OPEN, FILE_NON_DIRECTORY_FILE);
        if (req == NULL) {
diff --git a/examples/winexe/winexe.c b/examples/winexe/winexe.c
index cf667a64ebc..429ba2f5163 100644
--- a/examples/winexe/winexe.c
+++ b/examples/winexe/winexe.c
@@ -872,6 +872,7 @@ static struct tevent_req *winexe_out_pipe_send(
                FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                FILE_OPEN,      /* CreateDisposition */
                0,              /* CreateOptions */
+               SMB2_IMPERSONATION_IMPERSONATION,
                0);             /* SecurityFlags */
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
@@ -1044,6 +1045,7 @@ static struct tevent_req *winexe_in_pipe_send(
                FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                FILE_OPEN,      /* CreateDisposition */
                0,              /* CreateOptions */
+               SMB2_IMPERSONATION_IMPERSONATION,
                0);             /* SecurityFlags */
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
@@ -1462,6 +1464,7 @@ static struct tevent_req *winexe_ctrl_send(
                FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                FILE_OPEN,      /* CreateDisposition */
                0,              /* CreateOptions */
+               SMB2_IMPERSONATION_IMPERSONATION,
                0);             /* SecurityFlags */
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
diff --git a/python/samba/tests/libsmb_samba_internal.py 
b/python/samba/tests/libsmb_samba_internal.py
index c88095c8bc2..8918d848ea8 100644
--- a/python/samba/tests/libsmb_samba_internal.py
+++ b/python/samba/tests/libsmb_samba_internal.py
@@ -59,7 +59,9 @@ class LibsmbTestCase(samba.tests.TestCase):
         creds.set_username(os.getenv("USERNAME"))
         creds.set_password(os.getenv("PASSWORD"))
 
-        c = libsmb_samba_internal.Conn(os.getenv("SERVER_IP"), "tmp", creds)
+        c = libsmb_samba_internal.Conn(os.getenv("SERVER_IP"), "tmp",
+                                       creds, multi_threaded=True,
+                                       force_smb1=True)
 
         mythreads = []
 
diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c
index 35edec88809..6cba4422634 100644
--- a/source3/libsmb/cli_smb2_fnum.c
+++ b/source3/libsmb/cli_smb2_fnum.c
@@ -171,6 +171,7 @@ struct tevent_req *cli_smb2_create_fnum_send(TALLOC_CTX 
*mem_ctx,
                                             struct cli_state *cli,
                                             const char *fname,
                                             uint32_t create_flags,
+                                            uint32_t impersonation_level,
                                             uint32_t desired_access,
                                             uint32_t file_attributes,
                                             uint32_t share_access,
@@ -262,7 +263,7 @@ struct tevent_req *cli_smb2_create_fnum_send(TALLOC_CTX 
*mem_ctx,
                                     cli->smb2.tcon,
                                     fname,
                                     flags_to_smb2_oplock(create_flags),
-                                    SMB2_IMPERSONATION_IMPERSONATION,
+                                    impersonation_level,
                                     desired_access,
                                     file_attributes,
                                     share_access,
@@ -334,6 +335,7 @@ NTSTATUS cli_smb2_create_fnum_recv(struct tevent_req *req, 
uint16_t *pfnum,
 NTSTATUS cli_smb2_create_fnum(struct cli_state *cli,
                        const char *fname,
                        uint32_t create_flags,
+                       uint32_t impersonation_level,
                        uint32_t desired_access,
                        uint32_t file_attributes,
                        uint32_t share_access,
@@ -359,6 +361,7 @@ NTSTATUS cli_smb2_create_fnum(struct cli_state *cli,
                goto fail;
        }
        req = cli_smb2_create_fnum_send(frame, ev, cli, fname, create_flags,
+                                       impersonation_level,
                                        desired_access, file_attributes,
                                        share_access, create_disposition,
                                        create_options);
@@ -641,6 +644,7 @@ NTSTATUS cli_smb2_mkdir(struct cli_state *cli, const char 
*dname)
        status = cli_smb2_create_fnum(cli,
                        dname,
                        0,                      /* create_flags */
+                       SMB2_IMPERSONATION_IMPERSONATION,
                        FILE_READ_ATTRIBUTES,   /* desired_access */
                        FILE_ATTRIBUTE_DIRECTORY, /* file attributes */
                        FILE_SHARE_READ|FILE_SHARE_WRITE, /* share_access */
@@ -679,6 +683,7 @@ NTSTATUS cli_smb2_rmdir(struct cli_state *cli, const char 
*dname)
        status = cli_smb2_create_fnum(cli,
                        dname,
                        0,                      /* create_flags */
+                       SMB2_IMPERSONATION_IMPERSONATION,
                        DELETE_ACCESS,          /* desired_access */
                        FILE_ATTRIBUTE_DIRECTORY, /* file attributes */
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* 
share_access */
@@ -697,6 +702,7 @@ NTSTATUS cli_smb2_rmdir(struct cli_state *cli, const char 
*dname)
                status = cli_smb2_create_fnum(cli,
                        dname,
                        0,                      /* create_flags */
+                       SMB2_IMPERSONATION_IMPERSONATION,
                        DELETE_ACCESS,          /* desired_access */
                        FILE_ATTRIBUTE_DIRECTORY, /* file attributes */
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* 
share_access */
@@ -745,6 +751,7 @@ NTSTATUS cli_smb2_unlink(struct cli_state *cli, const char 
*fname)
        status = cli_smb2_create_fnum(cli,
                        fname,
                        0,                      /* create_flags */
+                       SMB2_IMPERSONATION_IMPERSONATION,
                        DELETE_ACCESS,          /* desired_access */
                        FILE_ATTRIBUTE_NORMAL, /* file attributes */
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* 
share_access */
@@ -763,6 +770,7 @@ NTSTATUS cli_smb2_unlink(struct cli_state *cli, const char 
*fname)
                status = cli_smb2_create_fnum(cli,
                        fname,
                        0,                      /* create_flags */
+                       SMB2_IMPERSONATION_IMPERSONATION,
                        DELETE_ACCESS,          /* desired_access */
                        FILE_ATTRIBUTE_NORMAL, /* file attributes */
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* 
share_access */
@@ -940,6 +948,7 @@ NTSTATUS cli_smb2_list(struct cli_state *cli,
        status = cli_smb2_create_fnum(cli,
                        parent_dir,
                        0,                      /* create_flags */
+                       SMB2_IMPERSONATION_IMPERSONATION,
                        SEC_DIR_LIST|SEC_DIR_READ_ATTRIBUTE,/* desired_access */
                        FILE_ATTRIBUTE_DIRECTORY, /* file attributes */
                        FILE_SHARE_READ|FILE_SHARE_WRITE, /* share_access */
@@ -1116,6 +1125,7 @@ NTSTATUS cli_smb2_qpathinfo_basic(struct cli_state *cli,
        status = cli_smb2_create_fnum(cli,
                        name,
                        0,                      /* create_flags */
+                       SMB2_IMPERSONATION_IMPERSONATION,
                        FILE_READ_ATTRIBUTES,   /* desired_access */
                        FILE_ATTRIBUTE_DIRECTORY, /* file attributes */
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* 
share_access */
@@ -1129,6 +1139,7 @@ NTSTATUS cli_smb2_qpathinfo_basic(struct cli_state *cli,
                status = cli_smb2_create_fnum(cli,
                        name,
                        0,                      /* create_flags */
+                       SMB2_IMPERSONATION_IMPERSONATION,
                        FILE_READ_ATTRIBUTES,           /* desired_access */
                        0, /* file attributes */
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* 
share_access */
@@ -1181,6 +1192,7 @@ NTSTATUS cli_smb2_chkpath(struct cli_state *cli,
        status = cli_smb2_create_fnum(cli,
                        name,
                        0,                      /* create_flags */
+                       SMB2_IMPERSONATION_IMPERSONATION,
                        FILE_READ_ATTRIBUTES,   /* desired_access */
                        FILE_ATTRIBUTE_DIRECTORY, /* file attributes */
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* 
share_access */
@@ -1226,6 +1238,7 @@ static NTSTATUS get_fnum_from_path(struct cli_state *cli,
        status = cli_smb2_create_fnum(cli,
                        name,
                        0,                      /* create_flags */
+                       SMB2_IMPERSONATION_IMPERSONATION,
                        desired_access,
                        0, /* file attributes */
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* 
share_access */
@@ -1245,6 +1258,7 @@ static NTSTATUS get_fnum_from_path(struct cli_state *cli,
                status = cli_smb2_create_fnum(cli,
                        name,
                        0,                      /* create_flags */
+                       SMB2_IMPERSONATION_IMPERSONATION,
                        desired_access,
                        0, /* file attributes */
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* 
share_access */
@@ -1259,6 +1273,7 @@ static NTSTATUS get_fnum_from_path(struct cli_state *cli,
                status = cli_smb2_create_fnum(cli,
                        name,
                        0,                      /* create_flags */
+                       SMB2_IMPERSONATION_IMPERSONATION,
                        desired_access,
                        FILE_ATTRIBUTE_DIRECTORY, /* file attributes */
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* 
share_access */
@@ -1994,6 +2009,7 @@ NTSTATUS cli_smb2_dskattr(struct cli_state *cli, const 
char *path,
        status = cli_smb2_create_fnum(cli,
                        path,
                        0,                      /* create_flags */
+                       SMB2_IMPERSONATION_IMPERSONATION,
                        FILE_READ_ATTRIBUTES,   /* desired_access */
                        FILE_ATTRIBUTE_DIRECTORY, /* file attributes */
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* 
share_access */
@@ -2103,6 +2119,7 @@ NTSTATUS cli_smb2_get_fs_full_size_info(struct cli_state 
*cli,
        /* First open the top level directory. */
        status =
            cli_smb2_create_fnum(cli, "", 0,               /* create_flags */
+                                SMB2_IMPERSONATION_IMPERSONATION,
                                 FILE_READ_ATTRIBUTES,     /* desired_access */
                                 FILE_ATTRIBUTE_DIRECTORY, /* file attributes */
                                 FILE_SHARE_READ | FILE_SHARE_WRITE |
@@ -2195,6 +2212,7 @@ NTSTATUS cli_smb2_get_fs_attr_info(struct cli_state *cli, 
uint32_t *fs_attr)
        /* First open the top level directory. */
        status =
            cli_smb2_create_fnum(cli, "", 0,               /* create_flags */
+                                SMB2_IMPERSONATION_IMPERSONATION,
                                 FILE_READ_ATTRIBUTES,     /* desired_access */
                                 FILE_ATTRIBUTE_DIRECTORY, /* file attributes */
                                 FILE_SHARE_READ | FILE_SHARE_WRITE |
@@ -2280,6 +2298,7 @@ NTSTATUS cli_smb2_get_fs_volume_info(struct cli_state 
*cli,
        /* First open the top level directory. */
        status =
            cli_smb2_create_fnum(cli, "", 0,               /* create_flags */
+                                SMB2_IMPERSONATION_IMPERSONATION,
                                 FILE_READ_ATTRIBUTES,     /* desired_access */
                                 FILE_ATTRIBUTE_DIRECTORY, /* file attributes */
                                 FILE_SHARE_READ | FILE_SHARE_WRITE |
diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h
index 4fce5fce1c3..921dc71d9eb 100644
--- a/source3/libsmb/cli_smb2_fnum.h
+++ b/source3/libsmb/cli_smb2_fnum.h
@@ -30,6 +30,7 @@ struct tevent_req *cli_smb2_create_fnum_send(TALLOC_CTX 
*mem_ctx,
                                             struct cli_state *cli,
                                             const char *fname,
                                             uint32_t create_flags,
+                                            uint32_t impersonation_level,
                                             uint32_t desired_access,
                                             uint32_t file_attributes,
                                             uint32_t share_access,
@@ -40,6 +41,7 @@ NTSTATUS cli_smb2_create_fnum_recv(struct tevent_req *req, 
uint16_t *pfnum,
 NTSTATUS cli_smb2_create_fnum(struct cli_state *cli,
                        const char *fname,
                        uint32_t create_flags,
+                       uint32_t impersonation_level,
                        uint32_t desired_access,
                        uint32_t file_attributes,
                        uint32_t share_access,
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c
index b50926307a5..6defa38fdee 100644
--- a/source3/libsmb/clifile.c
+++ b/source3/libsmb/clifile.c
@@ -1951,6 +1951,7 @@ static struct tevent_req *cli_ntcreate1_send(TALLOC_CTX 
*mem_ctx,
                                             uint32_t ShareAccess,
                                             uint32_t CreateDisposition,
                                             uint32_t CreateOptions,
+                                            uint32_t ImpersonationLevel,
                                             uint8_t SecurityFlags)
 {
        struct tevent_req *req, *subreq;
@@ -1985,7 +1986,7 @@ static struct tevent_req *cli_ntcreate1_send(TALLOC_CTX 
*mem_ctx,
        SIVAL(vwv+17, 1, CreateDisposition);
        SIVAL(vwv+19, 1, CreateOptions |
                (cli->backup_intent ? FILE_OPEN_FOR_BACKUP_INTENT : 0));
-       SIVAL(vwv+21, 1, 0x02); /* ImpersonationLevel */
+       SIVAL(vwv+21, 1, ImpersonationLevel);
        SCVAL(vwv+23, 1, SecurityFlags);
 
        bytes = talloc_array(state, uint8_t, 0);
@@ -2098,6 +2099,7 @@ struct tevent_req *cli_ntcreate_send(TALLOC_CTX *mem_ctx,
                                     uint32_t share_access,
                                     uint32_t create_disposition,
                                     uint32_t create_options,
+                                    uint32_t impersonation_level,
                                     uint8_t security_flags)
 {
        struct tevent_req *req, *subreq;
@@ -2116,7 +2118,8 @@ struct tevent_req *cli_ntcreate_send(TALLOC_CTX *mem_ctx,
                }
 
                subreq = cli_smb2_create_fnum_send(
-                       state, ev, cli, fname, create_flags, desired_access,
+                       state, ev, cli, fname, create_flags,
+                       impersonation_level, desired_access,
                        file_attributes, share_access, create_disposition,
                        create_options);
        } else {
@@ -2124,7 +2127,7 @@ struct tevent_req *cli_ntcreate_send(TALLOC_CTX *mem_ctx,
                subreq = cli_ntcreate1_send(
                        state, ev, cli, fname, create_flags, desired_access,
                        file_attributes, share_access, create_disposition,
-                       create_options, security_flags);
+                       create_options, impersonation_level, security_flags);
        }
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
@@ -2194,6 +2197,7 @@ NTSTATUS cli_ntcreate(struct cli_state *cli,
        TALLOC_CTX *frame = talloc_stackframe();
        struct tevent_context *ev;
        struct tevent_req *req;
+       uint32_t ImpersonationLevel = SMB2_IMPERSONATION_IMPERSONATION;
        NTSTATUS status = NT_STATUS_NO_MEMORY;
 
        if (smbXcli_conn_has_async_calls(cli->conn)) {
@@ -2212,7 +2216,7 @@ NTSTATUS cli_ntcreate(struct cli_state *cli,
        req = cli_ntcreate_send(frame, ev, cli, fname, CreatFlags,
                                DesiredAccess, FileAttributes, ShareAccess,
                                CreateDisposition, CreateOptions,
-                               SecurityFlags);
+                               ImpersonationLevel, SecurityFlags);
        if (req == NULL) {
                goto fail;
        }
diff --git a/source3/libsmb/clireadwrite.c b/source3/libsmb/clireadwrite.c
index 6bf3df6913f..e953fa5e228 100644
--- a/source3/libsmb/clireadwrite.c
+++ b/source3/libsmb/clireadwrite.c
@@ -1065,6 +1065,130 @@ NTSTATUS cli_write_andx_recv(struct tevent_req *req, 
size_t *pwritten)
        return NT_STATUS_OK;
 }
 
+struct cli_write_state {
+       struct cli_state *cli;
+       size_t written;
+};
+
+static void cli_write_done(struct tevent_req *subreq);
+
+/*
+ * Used to write to a file remotely.
+ * This is similar in functionality to cli_push_send(), except this is a more
+ * finer-grain API. For example, if the data we want to write exceeds the max
+ * write size of the underlying connection, then it's the caller's
+ * responsibility to handle this.
+ * For writing a small amount of data to file, this is a simpler API to use.
+ */
+struct tevent_req *cli_write_send(TALLOC_CTX *mem_ctx,
+                                 struct tevent_context *ev,
+                                 struct cli_state *cli, uint16_t fnum,
+                                 uint16_t mode, const uint8_t *buf,
+                                 off_t offset, size_t size)
+{
+       struct tevent_req *req = NULL;
+       struct cli_write_state *state = NULL;
+       struct tevent_req *subreq = NULL;
+
+       req = tevent_req_create(mem_ctx, &state, struct cli_write_state);
+       if (req == NULL) {
+               return NULL;
+       }
+       state->cli = cli;
+
+       if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
+               uint32_t max_size;
+               bool ok;
+
+               ok = smb2cli_conn_req_possible(state->cli->conn, &max_size);
+               if (!ok) {
+                       tevent_req_nterror(
+                               req,
+                               NT_STATUS_INSUFFICIENT_RESOURCES);
+                       return tevent_req_post(req, ev);
+               }
+
+               /*
+                * downgrade depending on the available credits
+                */
+               size = MIN(max_size, size);
+
+               subreq = cli_smb2_write_send(state,
+                                            ev,
+                                            cli,
+                                            fnum,
+                                            mode,
+                                            buf,
+                                            offset,
+                                            size);
+       } else {
+               bool ok;
+
+               ok = smb1cli_conn_req_possible(state->cli->conn);
+               if (!ok) {
+                       tevent_req_nterror(
+                               req,
+                               NT_STATUS_INSUFFICIENT_RESOURCES);
+                       return tevent_req_post(req, ev);
+               }
+
+               subreq = cli_write_andx_send(state,
+                                            ev,
+                                            cli,
+                                            fnum,
+                                            mode,
+                                            buf,
+                                            offset,
+                                            size);
+       }
+       if (tevent_req_nomem(subreq, req)) {
+               return tevent_req_post(req, ev);
+       }
+       tevent_req_set_callback(subreq, cli_write_done, req);
+
+       return req;
+}
+
+static void cli_write_done(struct tevent_req *subreq)
+{
+       struct tevent_req *req =
+               tevent_req_callback_data(subreq,
+               struct tevent_req);
+       struct cli_write_state *state =
+               tevent_req_data(req,
+               struct cli_write_state);
+       NTSTATUS status;
+
+       if (smbXcli_conn_protocol(state->cli->conn) >= PROTOCOL_SMB2_02) {
+               status = cli_smb2_write_recv(subreq, &state->written);
+       } else {
+               status = cli_write_andx_recv(subreq, &state->written);
+       }
+       TALLOC_FREE(subreq);
+       if (tevent_req_nterror(req, status)) {
+               return;
+       }
+       tevent_req_done(req);
+}
+
+NTSTATUS cli_write_recv(struct tevent_req *req, size_t *pwritten)
+{
+       struct cli_write_state *state =
+               tevent_req_data(req,
+               struct cli_write_state);
+       NTSTATUS status;
+
+       if (tevent_req_is_nterror(req, &status)) {
+               tevent_req_received(req);
+               return status;
+       }
+       if (pwritten != NULL) {
+               *pwritten = state->written;
+       }
+       tevent_req_received(req);
+       return NT_STATUS_OK;
+}
+
 struct cli_smb1_writeall_state {
        struct tevent_context *ev;
        struct cli_state *cli;
@@ -1339,6 +1463,16 @@ static void cli_push_setup_chunks(struct tevent_req 
*req);
 static void cli_push_chunk_ship(struct cli_push_chunk *chunk);
 static void cli_push_chunk_done(struct tevent_req *subreq);
 
+/*
+ * Used to write to a file remotely.
+ * This is similar in functionality to cli_write_send(), except this API
+ * handles writing a large file by breaking the data into chunks (so we don't
+ * exceed the max write size of the underlying connection). To do this, the
+ * (*source) callback handles copying the underlying file data into a message
+ * buffer, one chunk at a time.
+ * This API is recommended when writing a potentially large amount of data,
+ * e.g. when copying a file (or doing a 'put').
+ */
 struct tevent_req *cli_push_send(TALLOC_CTX *mem_ctx, struct tevent_context 
*ev,
                                 struct cli_state *cli,
                                 uint16_t fnum, uint16_t mode,
diff --git a/source3/libsmb/clisymlink.c b/source3/libsmb/clisymlink.c
index 54435e468cd..1330752358d 100644
--- a/source3/libsmb/clisymlink.c
+++ b/source3/libsmb/clisymlink.c
@@ -72,7 +72,8 @@ struct tevent_req *cli_symlink_send(TALLOC_CTX *mem_ctx,
                FILE_READ_ATTRIBUTES|FILE_WRITE_ATTRIBUTES,
                FILE_ATTRIBUTE_NORMAL, FILE_SHARE_NONE, FILE_CREATE,
                FILE_OPEN_REPARSE_POINT|FILE_SYNCHRONOUS_IO_NONALERT|
-               FILE_NON_DIRECTORY_FILE, 0);


-- 
Samba Shared Repository

Reply via email to