The branch, master has been updated
       via  f854209 s4-libcli: Fix the fd leak. Close open file descriptor 
before return.
       via  cff7adb samba-tool: Rename samba-tool command gpo2 --> gpo
       via  e2af384 samba-tool: Remove C version of samba-tool
       via  7d137f8 samba-tool: Add implementation of gpo create command
       via  fb798d3 samba-tool: Add functions to create directories and copy 
files over SMB share
       via  65dcf82 s4-libcli: get_acl and set_acl require raw_open to set 
security descriptor
       via  52d6023 s4-libcli: Check if short_name is not null, before 
converting to python string
       via  38b8d38 s4-libcli: Replace smb_composite_connect() with 
smb_full_connection()
       via  6cce5fd s4-policy: Use the correct local directory for stat.
       via  c670465 samba-tool: Rename copy_directory_recurse to 
copy_directory_remote_to_local
       via  1e36679 samba-tool: Addd functions to print GPO flags and GPlink 
options
       via  463ab48 s4-policy: Add python wrapper for ads_to_dir_access_mask() 
function
       via  0c8d742 s4-policy: Expose gp_ads_to_dir_access_mask() function
       via  2d90caf s4-libcli: Added python SMB methods for mkdir(), rmdir(), 
chkpath()
       via  a7f3545 pyldb: return a copy of key constant DNs via python 
interface
      from  785c65e We don't need check_name() here. All possible paths to 
dptr_create() have already called check_name.

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


- Log -----------------------------------------------------------------
commit f854209996491b34b7326c956d512f3d77db600e
Author: Amitay Isaacs <[email protected]>
Date:   Wed Aug 3 10:50:31 2011 +1000

    s4-libcli: Fix the fd leak. Close open file descriptor before return.
    
    Signed-off-by: Andrew Bartlett <[email protected]>
    
    Autobuild-User: Andrew Bartlett <[email protected]>
    Autobuild-Date: Wed Aug  3 07:49:12 CEST 2011 on sn-devel-104

commit cff7adb7ec79feecff73415b2ef4602c2fd4b2ae
Author: Amitay Isaacs <[email protected]>
Date:   Wed Aug 3 09:37:04 2011 +1000

    samba-tool: Rename samba-tool command gpo2 --> gpo
    
    Signed-off-by: Andrew Bartlett <[email protected]>

commit e2af38415163f248e3dbd5a2abc156761e74b87c
Author: Amitay Isaacs <[email protected]>
Date:   Wed Aug 3 09:21:21 2011 +1000

    samba-tool: Remove C version of samba-tool
    
    Python version of samba-tool has now implemented all the commands
    from C version and more.
    
    Signed-off-by: Andrew Bartlett <[email protected]>

commit 7d137f8bda1cc245762f53e6e8e562dda0336bdb
Author: Amitay Isaacs <[email protected]>
Date:   Tue Aug 2 16:13:43 2011 +1000

    samba-tool: Add implementation of gpo create command
    
    Signed-off-by: Andrew Bartlett <[email protected]>

commit fb798d35df570d7cd9ad6386595dff9c5b0321e5
Author: Amitay Isaacs <[email protected]>
Date:   Tue Aug 2 16:13:01 2011 +1000

    samba-tool: Add functions to create directories and copy files over SMB 
share
    
    Signed-off-by: Andrew Bartlett <[email protected]>

commit 65dcf82e644e8b57d3e09ad428a63a4708057311
Author: Amitay Isaacs <[email protected]>
Date:   Tue Aug 2 16:10:21 2011 +1000

    s4-libcli: get_acl and set_acl require raw_open to set security descriptor
    
    Signed-off-by: Andrew Bartlett <[email protected]>

commit 52d602335be1826e6a99a6470c03062ba908d373
Author: Amitay Isaacs <[email protected]>
Date:   Tue Aug 2 16:07:43 2011 +1000

    s4-libcli: Check if short_name is not null, before converting to python 
string
    
    Signed-off-by: Andrew Bartlett <[email protected]>

commit 38b8d38b30370bf930a647bceceed7fd407b649b
Author: Amitay Isaacs <[email protected]>
Date:   Tue Aug 2 16:04:52 2011 +1000

    s4-libcli: Replace smb_composite_connect() with smb_full_connection()
    
    Python smb connection now uses smb_full_connection method.
    
    Signed-off-by: Andrew Bartlett <[email protected]>

commit 6cce5fd43e9036d2d57bb3cd9aef905463acdcce
Author: Amitay Isaacs <[email protected]>
Date:   Tue Aug 2 15:13:36 2011 +1000

    s4-policy: Use the correct local directory for stat.
    
    Signed-off-by: Andrew Bartlett <[email protected]>

commit c670465c23765bade0d248215cbdddafbd8468ee
Author: Amitay Isaacs <[email protected]>
Date:   Mon Aug 1 15:47:10 2011 +1000

    samba-tool: Rename copy_directory_recurse to copy_directory_remote_to_local
    
    gpo fetch is remote->local and gpo create is local->remote
    local is local filesystem and remote is smb share.
    Need two functions to copy local->remote and remote->local.
    
    Signed-off-by: Andrew Bartlett <[email protected]>

commit 1e3667934b777034d6460f938ba5093f3c913144
Author: Amitay Isaacs <[email protected]>
Date:   Mon Aug 1 15:41:19 2011 +1000

    samba-tool: Addd functions to print GPO flags and GPlink options
    
    Use methods from python wrapper to convert gpo flags and gplink
    options to string.
    
    Signed-off-by: Andrew Bartlett <[email protected]>

commit 463ab48868e917b1ccad22bfb5c3c101b6c44e7b
Author: Amitay Isaacs <[email protected]>
Date:   Mon Aug 1 15:35:32 2011 +1000

    s4-policy: Add python wrapper for ads_to_dir_access_mask() function
    
    Signed-off-by: Andrew Bartlett <[email protected]>

commit 0c8d74299234b50c8705d7700da325146cf9a5fe
Author: Amitay Isaacs <[email protected]>
Date:   Mon Aug 1 14:51:25 2011 +1000

    s4-policy: Expose gp_ads_to_dir_access_mask() function
    
    Signed-off-by: Andrew Bartlett <[email protected]>

commit 2d90cafa1013204d664c94e89c6745eb546ee254
Author: Amitay Isaacs <[email protected]>
Date:   Fri Jul 29 16:17:49 2011 +1000

    s4-libcli: Added python SMB methods for mkdir(), rmdir(), chkpath()
    
    Updated docstrings for all methods.
    
    Signed-off-by: Andrew Bartlett <[email protected]>

commit a7f3545b825de86f7b551d8b517031998327a92d
Author: Andrew Tridgell <[email protected]>
Date:   Mon Aug 1 12:39:48 2011 +1000

    pyldb: return a copy of key constant DNs via python interface
    
    this prevents an easy coding error where the caller modifies one of
    the key DNs for the database, by using an add_child function or
    similar
    
    Pair-Programmed-With: Amitay Isaacs <[email protected]>
    Pair-Programmed-With: Andrew Bartlett <[email protected]>
    Signed-off-by: Andrew Bartlett <[email protected]>

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

Summary of changes:
 lib/ldb/pyldb.c                                   |   25 +-
 source4/lib/policy/gp_filesys.c                   |    2 +-
 source4/lib/policy/gp_manage.c                    |    2 +-
 source4/lib/policy/policy.h                       |    1 +
 source4/lib/policy/pypolicy.c                     |   19 +-
 source4/libcli/pysmb.c                            |  253 +++++++--
 source4/samba_tool/gpo.c                          |  609 ---------------------
 source4/samba_tool/samba_tool.c                   |  385 -------------
 source4/samba_tool/samba_tool.h                   |   39 --
 source4/samba_tool/vampire.c                      |  130 -----
 source4/samba_tool/wscript_build                  |    9 -
 source4/scripting/python/samba/netcmd/__init__.py |    2 +-
 source4/scripting/python/samba/netcmd/gpo.py      |  289 +++++++++--
 wscript_build                                     |    1 -
 14 files changed, 493 insertions(+), 1273 deletions(-)
 delete mode 100644 source4/samba_tool/gpo.c
 delete mode 100644 source4/samba_tool/samba_tool.c
 delete mode 100644 source4/samba_tool/samba_tool.h
 delete mode 100644 source4/samba_tool/vampire.c
 delete mode 100644 source4/samba_tool/wscript_build


Changeset truncated at 500 lines:

diff --git a/lib/ldb/pyldb.c b/lib/ldb/pyldb.c
index c92d64d..e9af227 100644
--- a/lib/ldb/pyldb.c
+++ b/lib/ldb/pyldb.c
@@ -589,6 +589,23 @@ static Py_ssize_t py_ldb_dn_len(PyLdbDnObject *self)
        return ldb_dn_get_comp_num(PyLdbDn_AsDn((PyObject *)self));
 }
 
+/*
+  copy a DN as a python object
+ */
+static PyObject *py_ldb_dn_copy(struct ldb_dn *dn)
+{
+       PyLdbDnObject *py_ret;
+
+       py_ret = (PyLdbDnObject *)PyLdbDn.tp_alloc(&PyLdbDn, 0);
+       if (py_ret == NULL) {
+               PyErr_NoMemory();
+               return NULL;
+       }
+       py_ret->mem_ctx = talloc_new(NULL);
+       py_ret->dn = ldb_dn_copy(py_ret->mem_ctx, dn);
+       return (PyObject *)py_ret;
+}
+
 static PyObject *py_ldb_dn_concat(PyLdbDnObject *self, PyObject *py_other)
 {
        struct ldb_dn *dn = PyLdbDn_AsDn((PyObject *)self), 
@@ -759,7 +776,7 @@ static PyObject *py_ldb_get_root_basedn(PyLdbObject *self)
        struct ldb_dn *dn = ldb_get_root_basedn(PyLdb_AsLdbContext(self));
        if (dn == NULL)
                Py_RETURN_NONE;
-       return PyLdbDn_FromDn(dn);
+       return py_ldb_dn_copy(dn);
 }
 
 
@@ -768,7 +785,7 @@ static PyObject *py_ldb_get_schema_basedn(PyLdbObject *self)
        struct ldb_dn *dn = ldb_get_schema_basedn(PyLdb_AsLdbContext(self));
        if (dn == NULL)
                Py_RETURN_NONE;
-       return PyLdbDn_FromDn(dn);
+       return py_ldb_dn_copy(dn);
 }
 
 static PyObject *py_ldb_get_config_basedn(PyLdbObject *self)
@@ -776,7 +793,7 @@ static PyObject *py_ldb_get_config_basedn(PyLdbObject *self)
        struct ldb_dn *dn = ldb_get_config_basedn(PyLdb_AsLdbContext(self));
        if (dn == NULL)
                Py_RETURN_NONE;
-       return PyLdbDn_FromDn(dn);
+       return py_ldb_dn_copy(dn);
 }
 
 static PyObject *py_ldb_get_default_basedn(PyLdbObject *self)
@@ -784,7 +801,7 @@ static PyObject *py_ldb_get_default_basedn(PyLdbObject 
*self)
        struct ldb_dn *dn = ldb_get_default_basedn(PyLdb_AsLdbContext(self));
        if (dn == NULL)
                Py_RETURN_NONE;
-       return PyLdbDn_FromDn(dn);
+       return py_ldb_dn_copy(dn);
 }
 
 static const char **PyList_AsStringList(TALLOC_CTX *mem_ctx, PyObject *list, 
diff --git a/source4/lib/policy/gp_filesys.c b/source4/lib/policy/gp_filesys.c
index 00d04d5..6e0cbed 100644
--- a/source4/lib/policy/gp_filesys.c
+++ b/source4/lib/policy/gp_filesys.c
@@ -417,7 +417,7 @@ static NTSTATUS push_recursive (struct gp_context *gp_ctx, 
const char *local_pat
                                                    remote_path, 
dirent->d_name);
                NT_STATUS_HAVE_NO_MEMORY(entry_remote_path);
 
-               if (stat(dirent->d_name, &s) != 0) {
+               if (stat(entry_local_path, &s) != 0) {
                        return NT_STATUS_UNSUCCESSFUL;
                }
                if (s.st_mode & S_IFDIR) {
diff --git a/source4/lib/policy/gp_manage.c b/source4/lib/policy/gp_manage.c
index f2d3243..e4321e5 100644
--- a/source4/lib/policy/gp_manage.c
+++ b/source4/lib/policy/gp_manage.c
@@ -24,7 +24,7 @@
 #include "param/param.h"
 #include "lib/policy/policy.h"
 
-static uint32_t gp_ads_to_dir_access_mask(uint32_t access_mask)
+uint32_t gp_ads_to_dir_access_mask(uint32_t access_mask)
 {
        uint32_t fs_mask;
 
diff --git a/source4/lib/policy/policy.h b/source4/lib/policy/policy.h
index d22c3d6..e6ce15c 100644
--- a/source4/lib/policy/policy.h
+++ b/source4/lib/policy/policy.h
@@ -123,5 +123,6 @@ NTSTATUS gp_get_ini_uint(struct gp_ini_context *ini, const 
char *section, const
 NTSTATUS gp_create_gpo (struct gp_context *gp_ctx, const char *display_name, 
struct gp_object **ret);
 NTSTATUS gp_create_gpt_security_descriptor (TALLOC_CTX *mem_ctx, struct 
security_descriptor *ds_sd, struct security_descriptor **ret);
 NTSTATUS gp_set_acl (struct gp_context *gp_ctx, const char *dn_str, const 
struct security_descriptor *sd);
+uint32_t gp_ads_to_dir_access_mask(uint32_t access_mask);
 
 #endif
diff --git a/source4/lib/policy/pypolicy.c b/source4/lib/policy/pypolicy.c
index 3f302e6..8a9aa47 100644
--- a/source4/lib/policy/pypolicy.c
+++ b/source4/lib/policy/pypolicy.c
@@ -108,11 +108,26 @@ static PyObject *py_get_gplink_options(PyObject *self, 
PyObject *args)
        return py_ret;
 }
 
+static PyObject *py_ads_to_dir_access_mask(PyObject *self, PyObject *args)
+{
+       uint32_t access_mask, dir_mask;
+
+       if (! PyArg_ParseTuple(args, "I", &access_mask))
+               return NULL;
+
+       dir_mask = gp_ads_to_dir_access_mask(access_mask);
+
+       return Py_BuildValue("I", dir_mask);
+}
+
+
 static PyMethodDef py_policy_methods[] = {
        { "get_gpo_flags", (PyCFunction)py_get_gpo_flags, METH_VARARGS,
                "get_gpo_flags(flags) -> list" },
-    { "get_gplink_options", (PyCFunction)py_get_gplink_options, METH_VARARGS,
-        "get_gplink_options(options) -> list" },
+       { "get_gplink_options", (PyCFunction)py_get_gplink_options, 
METH_VARARGS,
+               "get_gplink_options(options) -> list" },
+       { "ads_to_dir_access_mask", (PyCFunction)py_ads_to_dir_access_mask, 
METH_VARARGS,
+               "ads_to_dir_access_mask(access_mask) -> dir_mask" },
        { NULL }
 };
 
diff --git a/source4/libcli/pysmb.c b/source4/libcli/pysmb.c
index 52d0b10..afa85ab 100644
--- a/source4/libcli/pysmb.c
+++ b/source4/libcli/pysmb.c
@@ -24,6 +24,7 @@
 #include "param/param.h"
 #include "param/pyparam.h"
 #include "system/dir.h"
+#include "system/filesys.h"
 #include "lib/events/events.h"
 #include "auth/credentials/credentials.h"
 #include "auth/credentials/pycredentials.h"
@@ -60,43 +61,39 @@ static void dos_format(char *s)
 
 
 /*
- * Connect to SMB share using smb_composite_connect
+ * Connect to SMB share using smb_full_connection
  */
 static NTSTATUS do_smb_connect(TALLOC_CTX *mem_ctx, struct smb_private_data 
*spdata,
                        const char *hostname, const char *service, struct 
smbcli_tree **tree)
 {
-       struct smb_composite_connect io;
+       struct smbcli_state *smb_state;
        NTSTATUS status;
-
-       gensec_init();
+       struct smbcli_options options;
+       struct smbcli_session_options session_options;
 
        *tree = NULL;
 
-       ZERO_STRUCT(io);
-
-       io.in.dest_host = hostname;
-
-       io.in.dest_ports = lpcfg_smb_ports(spdata->lp_ctx);
-       io.in.socket_options = lpcfg_socket_options(spdata->lp_ctx);
-       io.in.gensec_settings = lpcfg_gensec_settings(mem_ctx, spdata->lp_ctx);
-
-       io.in.called_name = lpcfg_netbios_name(spdata->lp_ctx);
-       io.in.workgroup = lpcfg_workgroup(spdata->lp_ctx);
-
-       lpcfg_smbcli_options(spdata->lp_ctx, &io.in.options);
-       lpcfg_smbcli_session_options(spdata->lp_ctx, &io.in.session_options);
+       gensec_init();
 
-       io.in.service = service;
-       io.in.service_type = NULL;
+       smb_state = smbcli_state_init(mem_ctx);
 
-       io.in.credentials = spdata->creds;
-       io.in.fallback_to_anonymous = false;
+       lpcfg_smbcli_options(spdata->lp_ctx, &options);
+       lpcfg_smbcli_session_options(spdata->lp_ctx, &session_options);
 
-       status = smb_composite_connect(&io, mem_ctx,
+       status = smbcli_full_connection(mem_ctx, &smb_state, hostname, 
+                                       lpcfg_smb_ports(spdata->lp_ctx),
+                                       service, 
+                                       NULL,
+                                       lpcfg_socket_options(spdata->lp_ctx),
+                                       spdata->creds,
                                        lpcfg_resolve_context(spdata->lp_ctx),
-                                       spdata->ev_ctx);
+                                       spdata->ev_ctx,
+                                       &options,
+                                       &session_options,
+                                       lpcfg_gensec_settings(mem_ctx, 
spdata->lp_ctx));
+
        if (NT_STATUS_IS_OK(status)) {
-               *tree = io.out.tree;
+               *tree = smb_state->tree;
        }
 
        return status;
@@ -113,7 +110,7 @@ static PyObject * py_smb_loadfile(py_talloc_Object *self, 
PyObject *args)
        NTSTATUS status;
        struct smb_private_data *spdata;
 
-       if (!PyArg_ParseTuple(args, "s", &filename)) {
+       if (!PyArg_ParseTuple(args, "s:loadfile", &filename)) {
                return NULL;
        }
 
@@ -139,7 +136,7 @@ static PyObject * py_smb_savefile(py_talloc_Object *self, 
PyObject *args)
        NTSTATUS status;
        struct smb_private_data *spdata;
 
-       if (!PyArg_ParseTuple(args, "ss", &filename, &data)) {
+       if (!PyArg_ParseTuple(args, "ss:savefile", &filename, &data)) {
                return NULL;
        }
 
@@ -169,7 +166,14 @@ static void py_smb_list_callback(struct clilist_file_info 
*f, const char *mask,
                dict = PyDict_New();
                if(dict) {
                        PyDict_SetItemString(dict, "name", 
PyString_FromString(f->name));
-                       PyDict_SetItemString(dict, "short_name", 
PyString_FromString(f->short_name));
+                       
+                       /* Windows does not always return short_name */
+                       if (f->short_name) {
+                               PyDict_SetItemString(dict, "short_name", 
PyString_FromString(f->short_name));
+                       } else {
+                               PyDict_SetItemString(dict, "short_name", 
Py_None);
+                       }
+
                        PyDict_SetItemString(dict, "size", 
PyLong_FromUnsignedLongLong(f->size));
                        PyDict_SetItemString(dict, "attrib", 
PyInt_FromLong(f->attrib));
                        PyDict_SetItemString(dict, "mtime", 
PyInt_FromLong(f->mtime));
@@ -194,7 +198,7 @@ static PyObject *py_smb_list(py_talloc_Object *self, 
PyObject *args, PyObject *k
        uint16_t attribute = FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY
                                | FILE_ATTRIBUTE_ARCHIVE;
 
-       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "z|sH",
+       if (!PyArg_ParseTupleAndKeywords(args, kwargs, "z|sH:list",
                                        discard_const_p(char *, kwnames),
                                        &base_dir, &user_mask, &attribute)) {
                return NULL;
@@ -223,32 +227,131 @@ static PyObject *py_smb_list(py_talloc_Object *self, 
PyObject *args, PyObject *k
 
 
 /*
+ * Create a directory
+ */
+static PyObject *py_smb_mkdir(py_talloc_Object *self, PyObject *args)
+{
+       NTSTATUS status;
+       const char *dirname;
+       struct smb_private_data *spdata;
+
+       if (!PyArg_ParseTuple(args, "s:mkdir", &dirname)) {
+               return NULL;
+       }
+
+       spdata = self->ptr;     
+       status = smbcli_mkdir(spdata->tree, dirname);
+       PyErr_NTSTATUS_IS_ERR_RAISE(status);
+
+       Py_RETURN_NONE;
+}
+
+
+/*
+ * Remove a directory
+ */
+static PyObject *py_smb_rmdir(py_talloc_Object *self, PyObject *args)
+{
+       NTSTATUS status;
+       const char *dirname;
+       struct smb_private_data *spdata;
+
+       if (!PyArg_ParseTuple(args, "s:rmdir", &dirname)) {
+               return NULL;
+       }
+
+       spdata = self->ptr;     
+       status = smbcli_rmdir(spdata->tree, dirname);
+       PyErr_NTSTATUS_IS_ERR_RAISE(status);
+
+       Py_RETURN_NONE;
+}
+
+
+/*
+ * Check existence of a path
+ */
+static PyObject *py_smb_chkpath(py_talloc_Object *self, PyObject *args)
+{
+       NTSTATUS status;
+       const char *path;
+       struct smb_private_data *spdata;
+
+       if (!PyArg_ParseTuple(args, "s:chkpath", &path)) {
+               return NULL;
+       }
+
+       spdata = self->ptr;     
+       status = smbcli_chkpath(spdata->tree, path);
+
+       if (NT_STATUS_IS_OK(status)) {
+               Py_RETURN_TRUE;
+       }
+
+       Py_RETURN_FALSE;
+}
+
+
+/*
  * Read ACL on a given file/directory as a security descriptor object
  */
 static PyObject *py_smb_getacl(py_talloc_Object *self, PyObject *args, 
PyObject *kwargs)
 {
        NTSTATUS status;
-       union smb_fileinfo io;
+       union smb_open io;
+       union smb_fileinfo fio;
        struct smb_private_data *spdata;
        const char *filename;
+       int fnum;
 
-       if (!PyArg_ParseTuple(args, "s", &filename)) {
+       if (!PyArg_ParseTuple(args, "s:get_acl", &filename)) {
                return NULL;
        }
 
        ZERO_STRUCT(io);
 
-       io.query_secdesc.level = RAW_FILEINFO_SEC_DESC;
-       io.query_secdesc.in.file.path = filename;
-       io.query_secdesc.in.secinfo_flags = 0;
+       spdata = self->ptr;     
+
+       io.generic.level = RAW_OPEN_NTCREATEX;
+       io.ntcreatex.in.root_fid.fnum = 0;
+       io.ntcreatex.in.flags = 0;
+       io.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+       io.ntcreatex.in.create_options = 0;
+       io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
+       io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | 
+                                       NTCREATEX_SHARE_ACCESS_WRITE;
+       io.ntcreatex.in.alloc_size = 0;
+       io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
+       io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
+       io.ntcreatex.in.security_flags = 0;
+       io.ntcreatex.in.fname = filename;
+       
+       status = smb_raw_open(spdata->tree, self->talloc_ctx, &io);
+       PyErr_NTSTATUS_IS_ERR_RAISE(status);
 
-       spdata = self->ptr;
+       fnum = io.ntcreatex.out.file.fnum;
+
+       ZERO_STRUCT(fio);
+
+       fio.query_secdesc.level = RAW_FILEINFO_SEC_DESC;
+       fio.query_secdesc.in.file.fnum = fnum;
+       fio.query_secdesc.in.secinfo_flags = SECINFO_OWNER |
+                                               SECINFO_GROUP |
+                                               SECINFO_DACL |
+                                               SECINFO_PROTECTED_DACL |
+                                               SECINFO_UNPROTECTED_DACL |
+                                               SECINFO_DACL |
+                                               SECINFO_PROTECTED_SACL |
+                                               SECINFO_UNPROTECTED_SACL;
+
+
+       status = smb_raw_query_secdesc(spdata->tree, self->talloc_ctx, &fio);
+       smbcli_close(spdata->tree, fnum);
 
-       status = smb_raw_query_secdesc(spdata->tree, self->talloc_ctx, &io);
        PyErr_NTSTATUS_IS_ERR_RAISE(status);
 
        return py_return_ndr_struct("samba.dcerpc.security", "descriptor",
-                               self->talloc_ctx, io.query_secdesc.out.sd);
+                               self->talloc_ctx, fio.query_secdesc.out.sd);
 }
 
 
@@ -258,13 +361,15 @@ static PyObject *py_smb_getacl(py_talloc_Object *self, 
PyObject *args, PyObject
 static PyObject *py_smb_setacl(py_talloc_Object *self, PyObject *args, 
PyObject *kwargs)
 {
        NTSTATUS status;
-       union smb_setfileinfo io;
+       union smb_open io;
+       union smb_setfileinfo fio;
        struct smb_private_data *spdata;
        const char *filename;
        PyObject *py_sd;
        struct security_descriptor *sd;
+       int fnum;
 
-       if (!PyArg_ParseTuple(args, "sO", &filename, &py_sd)) {
+       if (!PyArg_ParseTuple(args, "sO:set_acl", &filename, &py_sd)) {
                return NULL;
        }
 
@@ -272,19 +377,45 @@ static PyObject *py_smb_setacl(py_talloc_Object *self, 
PyObject *args, PyObject
 
        sd = py_talloc_get_type(py_sd, struct security_descriptor);
        if (!sd) {
-               PyErr_Format(PyExc_TypeError,
-                               "Expected dcerpc.security.descriptor for 
security_descriptor argument, got %s", 
talloc_get_name(py_talloc_get_ptr(py_sd)));
+               PyErr_Format(PyExc_TypeError, 
+                       "Expected dcerpc.security.descriptor as argument, got 
%s", 
+                       talloc_get_name(py_talloc_get_ptr(py_sd)));
                return NULL;
        }
 
        ZERO_STRUCT(io);
 
-       io.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;
-       io.set_secdesc.in.file.path = filename;
-       io.set_secdesc.in.secinfo_flags = 0;
-       io.set_secdesc.in.sd = sd;
+       spdata = self->ptr;     
+
+       io.generic.level = RAW_OPEN_NTCREATEX;
+       io.ntcreatex.in.root_fid.fnum = 0;
+       io.ntcreatex.in.flags = 0;
+       io.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+       io.ntcreatex.in.create_options = 0;
+       io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
+       io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | 
+                                       NTCREATEX_SHARE_ACCESS_WRITE;
+       io.ntcreatex.in.alloc_size = 0;
+       io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
+       io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
+       io.ntcreatex.in.security_flags = 0;
+       io.ntcreatex.in.fname = filename;
+       
+       status = smb_raw_open(spdata->tree, self->talloc_ctx, &io);
+       PyErr_NTSTATUS_IS_ERR_RAISE(status);
+
+       fnum = io.ntcreatex.out.file.fnum;
+
+       ZERO_STRUCT(fio);
+
+       fio.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;
+       fio.set_secdesc.in.file.fnum = fnum;
+       fio.set_secdesc.in.secinfo_flags = 0;
+       fio.set_secdesc.in.sd = sd;
+
+       status = smb_raw_set_secdesc(spdata->tree, &fio);
+       smbcli_close(spdata->tree, fnum);
 
-       status = smb_raw_set_secdesc(spdata->tree, &io);
        PyErr_NTSTATUS_IS_ERR_RAISE(status);
 
        Py_RETURN_NONE;
@@ -293,15 +424,34 @@ static PyObject *py_smb_setacl(py_talloc_Object *self, 
PyObject *args, PyObject
 
 static PyMethodDef py_smb_methods[] = {
        { "loadfile", (PyCFunction)py_smb_loadfile, METH_VARARGS,
-               "Read contents of a file" },
+               "loadfile(path) -> file contents as a string\n\n \
+               Read contents of a file." },
        { "savefile", (PyCFunction)py_smb_savefile, METH_VARARGS,
-               "Write contents to a file" },
+               "savefile(path, str) -> None\n\n \
+               Write string str to file." },
        { "list", (PyCFunction)py_smb_list, METH_VARARGS|METH_KEYWORDS,
-               "List contents of a directory" },
+               "list(path) -> directory contents as a dictionary\n\n \
+               List contents of a directory. The keys are, \n \
+               \tname: Long name of the directory item\n \
+               \tshort_name: Short name of the directory item\n \
+               \tsize: File size in bytes\n \
+               \tattrib: Attributes\n \
+               \tmtime: Modification time\n" },
+       { "mkdir", (PyCFunction)py_smb_mkdir, METH_VARARGS,
+               "mkdir(path) -> None\n\n \
+               Create a directory." },
+       { "rmdir", (PyCFunction)py_smb_rmdir, METH_VARARGS,
+               "rmdir(path) -> None\n\n \
+               Delete a directory." },
+       { "chkpath", (PyCFunction)py_smb_chkpath, METH_VARARGS,
+               "chkpath(path) -> True or False\n\n \
+               Return true if path exists, false otherwise." },
        { "get_acl", (PyCFunction)py_smb_getacl, METH_VARARGS,
-               "Get security descriptor for a file" },
+               "get_acl(path) -> security_descriptor object\n\n \
+               Get security descriptor for file." },
        { "set_acl", (PyCFunction)py_smb_setacl, METH_VARARGS,
-               "Set security descriptor for a file" },
+               "set_acl(path, security_descriptor) -> None\n\n \


-- 
Samba Shared Repository

Reply via email to