[PATCH] Remove s4 SMB client python bindings
Jeremy Allison
jra at samba.org
Fri Jan 25 22:36:37 UTC 2019
On Fri, Jan 25, 2019 at 01:34:07PM +1300, Tim Beale via samba-technical wrote:
> One last patch to remove the s4 SMB client python bindings, as nothing in master uses them anymore (everything uses the s3 bindings now).
>
> This is only for master/v4.11. Samba v4.10 will have a warning (pending patch backport) that these bindings are deprecated, just in case there are any external consumers that are using them.
>
> CI pass: https://gitlab.com/catalyst-samba/samba/pipelines/44566790
>
>
> Merge request: https://gitlab.com/samba-team/samba/merge_requests/208
LGTM ! RB+ and pushed.
Thanks Tim,
Jeremy.
> From c9864c9aa107c613969e469895d5deb3ed9e6bf1 Mon Sep 17 00:00:00 2001
> From: Tim Beale <timbeale at catalyst.net.nz>
> Date: Thu, 17 Jan 2019 10:52:24 +1300
> Subject: [PATCH 1/2] s3:pylibsmb: Initialize pointers to NULL in new API code
>
> Fix a few uninitialized pointers that managed to sneak through review.
>
> Signed-off-by: Tim Beale <timbeale at catalyst.net.nz>
> Reviewed-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
> ---
> source3/libsmb/pylibsmb.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/source3/libsmb/pylibsmb.c b/source3/libsmb/pylibsmb.c
> index b4903a9..629ff0a 100644
> --- a/source3/libsmb/pylibsmb.c
> +++ b/source3/libsmb/pylibsmb.c
> @@ -1223,7 +1223,7 @@ static PyObject *py_cli_list(struct py_cli_state *self,
> char *user_mask = NULL;
> unsigned int attribute = LIST_ATTRIBUTE_MASK;
> NTSTATUS status;
> - PyObject *result;
> + PyObject *result = NULL;
> const char *kwlist[] = { "directory", "mask", "attribs", NULL };
>
> if (!ParseTupleAndKeywords(args, kwds, "z|sH:list", kwlist,
> @@ -1313,7 +1313,7 @@ static NTSTATUS remove_dir(struct py_cli_state *self, const char *dirname)
> static PyObject *py_smb_rmdir(struct py_cli_state *self, PyObject *args)
> {
> NTSTATUS status;
> - const char *dirname;
> + const char *dirname = NULL;
>
> if (!PyArg_ParseTuple(args, "s:rmdir", &dirname)) {
> return NULL;
> @@ -1331,7 +1331,7 @@ static PyObject *py_smb_rmdir(struct py_cli_state *self, PyObject *args)
> static PyObject *py_smb_mkdir(struct py_cli_state *self, PyObject *args)
> {
> NTSTATUS status;
> - const char *dirname;
> + const char *dirname = NULL;
>
> if (!PyArg_ParseTuple(args, "s:mkdir", &dirname)) {
> return NULL;
> @@ -1379,7 +1379,7 @@ static bool check_dir_path(struct py_cli_state *self, const char *path)
>
> static PyObject *py_smb_chkpath(struct py_cli_state *self, PyObject *args)
> {
> - const char *path;
> + const char *path = NULL;
> bool dir_exists;
>
> if (!PyArg_ParseTuple(args, "s:chkpath", &path)) {
> --
> 2.7.4
>
>
> From a373fe3db7d9872757c977b7ebb9d8d2d305dada Mon Sep 17 00:00:00 2001
> From: Tim Beale <timbeale at catalyst.net.nz>
> Date: Tue, 22 Jan 2019 11:18:50 +1300
> Subject: [PATCH 2/2] s4:libcli: Remove (now unused) pysmb.c bindings
>
> The s4 SMB client bindings don't support SMBv2, so we've made the
> decision to use the s3 SMB client bindings/library code instead.
> Everything in the Samba codebase now uses the s3 bindings, and we'll
> add a warning message to Samba v4.10 that the s4 bindings are
> deprecated. This patch removes the unused s4 bindings completely for
> the next (i.e. v4.11) release.
>
> BUG: https://bugzilla.samba.org/show_bug.cgi?id=13676
>
> Signed-off-by: Tim Beale <timbeale at catalyst.net.nz>
> ---
> source4/libcli/pysmb.c | 747 -------------------------------------------
> source4/libcli/wscript_build | 10 -
> 2 files changed, 757 deletions(-)
> delete mode 100644 source4/libcli/pysmb.c
>
> diff --git a/source4/libcli/pysmb.c b/source4/libcli/pysmb.c
> deleted file mode 100644
> index 5a02816..0000000
> --- a/source4/libcli/pysmb.c
> +++ /dev/null
> @@ -1,747 +0,0 @@
> -/*
> - Unix SMB/CIFS implementation.
> -
> - Copyright (C) Amitay Isaacs 2011
> -
> - This program is free software; you can redistribute it and/or modify
> - it under the terms of the GNU General Public License as published by
> - the Free Software Foundation; either version 3 of the License, or
> - (at your option) any later version.
> -
> - This program is distributed in the hope that it will be useful,
> - but WITHOUT ANY WARRANTY; without even the implied warranty of
> - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> - GNU General Public License for more details.
> -
> - You should have received a copy of the GNU General Public License
> - along with this program. If not, see <http://www.gnu.org/licenses/>.
> -*/
> -
> -#include <Python.h>
> -#include "python/py3compat.h"
> -#include <tevent.h>
> -#include <pytalloc.h>
> -#include "includes.h"
> -#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"
> -#include "auth/gensec/gensec.h"
> -#include "libcli/libcli.h"
> -#include "libcli/raw/libcliraw.h"
> -#include "libcli/raw/raw_proto.h"
> -#include "libcli/resolve/resolve.h"
> -#include "libcli/util/pyerrors.h"
> -#include "libcli/smb_composite/smb_composite.h"
> -#include "libcli/security/security_descriptor.h"
> -#include "librpc/rpc/pyrpc_util.h"
> -
> -static PyTypeObject PySMB;
> -
> -void initsmb(void);
> -
> -struct smb_private_data {
> - struct loadparm_context *lp_ctx;
> - struct cli_credentials *creds;
> - struct tevent_context *ev_ctx;
> - struct smbcli_tree *tree;
> -};
> -
> -static void dos_format(char *s)
> -{
> - string_replace(s, '/', '\\');
> -}
> -
> -
> -/*
> - * 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_options *options,
> - struct smbcli_session_options *session_options,
> - struct smbcli_tree **tree)
> -{
> - struct smbcli_state *smb_state;
> - NTSTATUS status;
> -
> - *tree = NULL;
> -
> - gensec_init();
> -
> - smb_state = smbcli_state_init(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,
> - options,
> - session_options,
> - lpcfg_gensec_settings(mem_ctx, spdata->lp_ctx));
> -
> - if (NT_STATUS_IS_OK(status)) {
> - *tree = smb_state->tree;
> - }
> -
> - return status;
> -}
> -
> -
> -/*
> - * Read SMB file and return the contents of the file as python string
> - */
> -static PyObject * py_smb_loadfile(PyObject *self, PyObject *args)
> -{
> - struct smb_composite_loadfile io;
> - const char *filename;
> - NTSTATUS status;
> - struct smb_private_data *spdata;
> -
> - if (!PyArg_ParseTuple(args, "s:loadfile", &filename)) {
> - return NULL;
> - }
> -
> - ZERO_STRUCT(io);
> -
> - io.in.fname = filename;
> -
> - spdata = pytalloc_get_ptr(self);
> - status = smb_composite_loadfile(spdata->tree, pytalloc_get_mem_ctx(self), &io);
> - PyErr_NTSTATUS_IS_ERR_RAISE(status);
> -
> - return Py_BuildValue(PYARG_BYTES_LEN, io.out.data, io.out.size);
> -}
> -
> -/*
> - * Create a SMB file with given string as the contents
> - */
> -static PyObject * py_smb_savefile(PyObject *self, PyObject *args)
> -{
> - struct smb_composite_savefile io;
> - const char *filename;
> - char *data = NULL;
> - Py_ssize_t size = 0;
> - NTSTATUS status;
> - struct smb_private_data *spdata;
> -
> - if (!PyArg_ParseTuple(args, "s"PYARG_BYTES_LEN":savefile", &filename, &data, &size )) {
> - return NULL;
> - }
> -
> - io.in.fname = filename;
> - io.in.data = (unsigned char *)data;
> - io.in.size = size;
> -
> - spdata = pytalloc_get_ptr(self);
> - status = smb_composite_savefile(spdata->tree, &io);
> - PyErr_NTSTATUS_IS_ERR_RAISE(status);
> -
> - Py_RETURN_NONE;
> -}
> -
> -/*
> - * Callback function to accumulate directory contents in a python list
> - */
> -static void py_smb_list_callback(struct clilist_file_info *f, const char *mask, void *state)
> -{
> - PyObject *py_dirlist;
> - PyObject *dict;
> -
> - if(!ISDOT(f->name) && !ISDOTDOT(f->name)) {
> - py_dirlist = (PyObject *)state;
> -
> - dict = PyDict_New();
> - if(dict) {
> - PyDict_SetItemString(dict, "name", PyStr_FromString(f->name));
> -
> - /* Windows does not always return short_name */
> - if (f->short_name) {
> - PyDict_SetItemString(dict, "short_name", PyStr_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));
> -
> - PyList_Append(py_dirlist, dict);
> - }
> - }
> -}
> -
> -/*
> - * List the directory contents for specified directory (Ignore '.' and '..' dirs)
> - */
> -static PyObject *py_smb_list(PyObject *self, PyObject *args, PyObject *kwargs)
> -{
> - struct smb_private_data *spdata;
> - PyObject *py_dirlist;
> - const char *kwnames[] = { "directory", "mask", "attribs", NULL };
> - char *base_dir;
> - char *user_mask = NULL;
> - char *mask;
> - uint16_t attribute = FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY
> - | FILE_ATTRIBUTE_ARCHIVE;
> -
> - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "z|sH:list",
> - discard_const_p(char *, kwnames),
> - &base_dir, &user_mask, &attribute)) {
> - return NULL;
> - }
> -
> - if (user_mask == NULL) {
> - mask = talloc_asprintf(pytalloc_get_mem_ctx(self), "%s\\*", base_dir);
> - } else {
> - mask = talloc_asprintf(pytalloc_get_mem_ctx(self), "%s\\%s", base_dir, user_mask);
> - }
> - dos_format(mask);
> -
> - spdata = pytalloc_get_ptr(self);
> -
> - if((py_dirlist = PyList_New(0)) == NULL) {
> - PyErr_NoMemory();
> - return NULL;
> - }
> -
> - smbcli_list(spdata->tree, mask, attribute, py_smb_list_callback, (void *)py_dirlist);
> -
> - talloc_free(mask);
> -
> - return py_dirlist;
> -}
> -
> -/*
> - * Create a directory
> - */
> -static PyObject *py_smb_mkdir(PyObject *self, PyObject *args)
> -{
> - NTSTATUS status;
> - const char *dirname;
> - struct smb_private_data *spdata;
> -
> - if (!PyArg_ParseTuple(args, "s:mkdir", &dirname)) {
> - return NULL;
> - }
> -
> - spdata = pytalloc_get_ptr(self);
> - status = smbcli_mkdir(spdata->tree, dirname);
> - PyErr_NTSTATUS_IS_ERR_RAISE(status);
> -
> - Py_RETURN_NONE;
> -}
> -
> -/*
> - * Remove a directory
> - */
> -static PyObject *py_smb_rmdir(PyObject *self, PyObject *args)
> -{
> - NTSTATUS status;
> - const char *dirname;
> - struct smb_private_data *spdata;
> -
> - if (!PyArg_ParseTuple(args, "s:rmdir", &dirname)) {
> - return NULL;
> - }
> -
> - spdata = pytalloc_get_ptr(self);
> - status = smbcli_rmdir(spdata->tree, dirname);
> - PyErr_NTSTATUS_IS_ERR_RAISE(status);
> -
> - Py_RETURN_NONE;
> -}
> -
> -
> -/*
> - * Remove a file
> - */
> -static PyObject *py_smb_unlink(PyObject *self, PyObject *args)
> -{
> - NTSTATUS status;
> - const char *filename;
> - struct smb_private_data *spdata;
> -
> - if (!PyArg_ParseTuple(args, "s:unlink", &filename)) {
> - return NULL;
> - }
> -
> - spdata = pytalloc_get_ptr(self);
> - status = smbcli_unlink(spdata->tree, filename);
> - PyErr_NTSTATUS_IS_ERR_RAISE(status);
> -
> - Py_RETURN_NONE;
> -}
> -
> -/*
> - * Remove a directory and all its contents
> - */
> -static PyObject *py_smb_deltree(PyObject *self, PyObject *args)
> -{
> - int status;
> - const char *dirname;
> - struct smb_private_data *spdata;
> -
> - if (!PyArg_ParseTuple(args, "s:deltree", &dirname)) {
> - return NULL;
> - }
> -
> - spdata = pytalloc_get_ptr(self);
> - status = smbcli_deltree(spdata->tree, dirname);
> - if (status <= 0) {
> - return NULL;
> - }
> -
> - Py_RETURN_NONE;
> -}
> -
> -/*
> - * Check existence of a path
> - */
> -static PyObject *py_smb_chkpath(PyObject *self, PyObject *args)
> -{
> - NTSTATUS status;
> - const char *path;
> - struct smb_private_data *spdata;
> -
> - if (!PyArg_ParseTuple(args, "s:chkpath", &path)) {
> - return NULL;
> - }
> -
> - spdata = pytalloc_get_ptr(self);
> - 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(PyObject *self, PyObject *args, PyObject *kwargs)
> -{
> - NTSTATUS status;
> - union smb_open io;
> - union smb_fileinfo fio;
> - struct smb_private_data *spdata;
> - const char *filename;
> - uint32_t sinfo = 0;
> - int access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
> - int fnum;
> -
> - if (!PyArg_ParseTuple(args, "s|Ii:get_acl", &filename, &sinfo, &access_mask)) {
> - return NULL;
> - }
> -
> - ZERO_STRUCT(io);
> -
> - spdata = pytalloc_get_ptr(self);
> -
> - io.generic.level = RAW_OPEN_NTCREATEX;
> - io.ntcreatex.in.root_fid.fnum = 0;
> - io.ntcreatex.in.flags = 0;
> - io.ntcreatex.in.access_mask = access_mask;
> - 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, pytalloc_get_mem_ctx(self), &io);
> - PyErr_NTSTATUS_IS_ERR_RAISE(status);
> -
> - fnum = io.ntcreatex.out.file.fnum;
> -
> - ZERO_STRUCT(fio);
> -
> - fio.query_secdesc.level = RAW_FILEINFO_SEC_DESC;
> - fio.query_secdesc.in.file.fnum = fnum;
> - if (sinfo)
> - fio.query_secdesc.in.secinfo_flags = sinfo;
> - else
> - fio.query_secdesc.in.secinfo_flags = SECINFO_OWNER |
> - SECINFO_GROUP |
> - SECINFO_DACL |
> - SECINFO_PROTECTED_DACL |
> - SECINFO_UNPROTECTED_DACL |
> - SECINFO_SACL |
> - SECINFO_PROTECTED_SACL |
> - SECINFO_UNPROTECTED_SACL;
> -
> - status = smb_raw_query_secdesc(spdata->tree, pytalloc_get_mem_ctx(self), &fio);
> - smbcli_close(spdata->tree, fnum);
> -
> - PyErr_NTSTATUS_IS_ERR_RAISE(status);
> -
> - return py_return_ndr_struct("samba.dcerpc.security", "descriptor",
> - pytalloc_get_mem_ctx(self), fio.query_secdesc.out.sd);
> -}
> -
> -/*
> - * Set ACL on file/directory using given security descriptor object
> - */
> -static PyObject *py_smb_setacl(PyObject *self, PyObject *args, PyObject *kwargs)
> -{
> - NTSTATUS status;
> - union smb_open io;
> - union smb_setfileinfo fio;
> - struct smb_private_data *spdata;
> - const char *filename;
> - PyObject *py_sd;
> - struct security_descriptor *sd;
> - uint32_t sinfo = 0;
> - int fnum;
> -
> - if (!PyArg_ParseTuple(args, "sO|I:get_acl", &filename, &py_sd, &sinfo)) {
> - return NULL;
> - }
> -
> - spdata = pytalloc_get_ptr(self);
> -
> - sd = pytalloc_get_type(py_sd, struct security_descriptor);
> - if (!sd) {
> - PyErr_Format(PyExc_TypeError,
> - "Expected dcerpc.security.descriptor as argument, got %s",
> - talloc_get_name(pytalloc_get_ptr(py_sd)));
> - return NULL;
> - }
> -
> - ZERO_STRUCT(io);
> -
> - spdata = pytalloc_get_ptr(self);
> -
> - 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, pytalloc_get_mem_ctx(self), &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;
> - if (sinfo)
> - fio.set_secdesc.in.secinfo_flags = sinfo;
> - else
> - fio.set_secdesc.in.secinfo_flags = SECINFO_OWNER |
> - SECINFO_GROUP |
> - SECINFO_DACL |
> - SECINFO_PROTECTED_DACL |
> - SECINFO_UNPROTECTED_DACL |
> - SECINFO_SACL |
> - SECINFO_PROTECTED_SACL |
> - SECINFO_UNPROTECTED_SACL;
> -
> - fio.set_secdesc.in.sd = sd;
> -
> - status = smb_raw_set_secdesc(spdata->tree, &fio);
> - smbcli_close(spdata->tree, fnum);
> -
> - PyErr_NTSTATUS_IS_ERR_RAISE(status);
> -
> - Py_RETURN_NONE;
> -}
> -
> -/*
> - * Open the file with the parameters passed in and return an object if OK
> - */
> -static PyObject *py_open_file(PyObject *self, PyObject *args, PyObject *kwargs)
> -{
> - NTSTATUS status;
> - union smb_open io;
> - struct smb_private_data *spdata;
> - const char *filename;
> - uint32_t access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
> - uint32_t share_access = NTCREATEX_SHARE_ACCESS_READ |
> - NTCREATEX_SHARE_ACCESS_WRITE;
> - uint32_t open_disposition = NTCREATEX_DISP_OPEN;
> - uint32_t create_options = 0;
> - TALLOC_CTX *mem_ctx;
> - int fnum;
> -
> - if (!PyArg_ParseTuple(args, "s|iiii:open_file",
> - &filename,
> - &access_mask,
> - &share_access,
> - &open_disposition,
> - &create_options)) {
> - return NULL;
> - }
> -
> - ZERO_STRUCT(io);
> -
> - spdata = pytalloc_get_ptr(self);
> -
> - mem_ctx = talloc_new(NULL);
> -
> - io.generic.level = RAW_OPEN_NTCREATEX;
> - io.ntcreatex.in.root_fid.fnum = 0;
> - io.ntcreatex.in.flags = 0;
> - io.ntcreatex.in.access_mask = access_mask;
> - io.ntcreatex.in.create_options = create_options;
> - io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
> - io.ntcreatex.in.share_access = share_access;
> - io.ntcreatex.in.alloc_size = 0;
> - io.ntcreatex.in.open_disposition = open_disposition;
> - io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
> - io.ntcreatex.in.security_flags = 0;
> - io.ntcreatex.in.fname = filename;
> -
> - status = smb_raw_open(spdata->tree, mem_ctx, &io);
> - talloc_free(mem_ctx);
> -
> - PyErr_NTSTATUS_IS_ERR_RAISE(status);
> -
> - fnum = io.ntcreatex.out.file.fnum;
> -
> - return Py_BuildValue("i", fnum);
> -}
> -
> -/*
> - * Close the file based on the fnum passed in
> - */
> -static PyObject *py_close_file(PyObject *self, PyObject *args, PyObject *kwargs)
> -{
> - struct smb_private_data *spdata;
> - int fnum;
> -
> - if (!PyArg_ParseTuple(args, "i:close_file", &fnum)) {
> - return NULL;
> - }
> -
> - spdata = pytalloc_get_ptr(self);
> -
> - /*
> - * Should check the status ...
> - */
> - smbcli_close(spdata->tree, fnum);
> -
> - Py_RETURN_NONE;
> -}
> -
> -static PyMethodDef py_smb_methods[] = {
> - { "loadfile", py_smb_loadfile, METH_VARARGS,
> - "loadfile(path) -> file contents as a "
> - PY_DESC_PY3_BYTES
> - "\n\n Read contents of a file." },
> - { "savefile", py_smb_savefile, METH_VARARGS,
> - "savefile(path, str) -> None\n\n Write "
> - PY_DESC_PY3_BYTES
> - " str to file." },
> - { "list", (PyCFunction)py_smb_list, METH_VARARGS|METH_KEYWORDS,
> - "list(path, access_mask='*', attribs=DEFAULT_ATTRS) -> \
> -directory contents as a dictionary\n \
> - DEFAULT_ATTRS: FILE_ATTRIBUTE_SYSTEM | \
> -FILE_ATTRIBUTE_DIRECTORY | \
> -FILE_ATTRIBUTE_ARCHIVE\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", py_smb_mkdir, METH_VARARGS,
> - "mkdir(path) -> None\n\n \
> - Create a directory." },
> - { "rmdir", py_smb_rmdir, METH_VARARGS,
> - "rmdir(path) -> None\n\n \
> - Delete a directory." },
> - { "unlink", py_smb_unlink, METH_VARARGS,
> - "unlink(path) -> None\n\n \
> - Delete a file." },
> - { "deltree", py_smb_deltree, METH_VARARGS,
> - "deltree(path) -> None\n\n \
> - Delete a directory and all its contents." },
> - { "chkpath", 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_acl(path[, security_info=0]) -> security_descriptor object\n\n \
> - Get security descriptor for file." },
> - { "set_acl", (PyCFunction)py_smb_setacl, METH_VARARGS,
> - "set_acl(path, security_descriptor[, security_info=0]) -> None\n\n \
> - Set security descriptor for file." },
> - { "open_file", (PyCFunction)py_open_file, METH_VARARGS,
> - "open_file(path, access_mask[, share_access[, open_disposition[, create_options]]] -> fnum\n\n \
> - Open a file. Throws NTSTATUS exceptions on errors." },
> - { "close_file", (PyCFunction)py_close_file, METH_VARARGS,
> - "close_file(fnum) -> None\n\n \
> - Close the file based on fnum."},
> - { NULL },
> -};
> -
> -static PyObject *py_smb_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
> -{
> - PyObject *py_creds = Py_None;
> - PyObject *py_lp = Py_None;
> - const char *kwnames[] = { "hostname", "service", "creds", "lp",
> - "ntlmv2_auth", "use_spnego", "sign", NULL };
> - const char *hostname = NULL;
> - const char *service = NULL;
> - PyObject *smb;
> - struct smb_private_data *spdata;
> - NTSTATUS status;
> - TALLOC_CTX *frame = NULL;
> - struct smbcli_options options;
> - struct smbcli_session_options session_options;
> - uint8_t ntlmv2_auth = 0xFF;
> - uint8_t use_spnego = 0xFF;
> - PyObject *sign = Py_False;
> -
> - /*
> - * These Python bindings are now deprecated because the s4 SMB client
> - * code doesn't support SMBv2 (and is unlikely to ever support it).
> - * The s3 libsmb_samba_internal bindings are a better choice for use
> - * within the Samba codebase, and support much the same API.
> - * This warning is mostly for external consumers that might be using
> - * these Python bindings (in which case, note libsmb_samba_internal
> - * is not a stable API and may change in future).
> - */
> - DBG_ERR("The smb.SMB() Python bindings are now deprecated "
> - "and will be removed in the next samba release\n");
> -
> - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "zz|OObbO",
> - discard_const_p(char *, kwnames),
> - &hostname, &service, &py_creds, &py_lp,
> - &ntlmv2_auth, &use_spnego, &sign)) {
> - return NULL;
> - }
> -
> - frame = talloc_stackframe();
> -
> - spdata = talloc_zero(frame, struct smb_private_data);
> - if (spdata == NULL) {
> - PyErr_NoMemory();
> - TALLOC_FREE(frame);
> - return NULL;
> - }
> -
> - spdata->lp_ctx = lpcfg_from_py_object(spdata, py_lp);
> - if (spdata->lp_ctx == NULL) {
> - PyErr_SetString(PyExc_TypeError, "Expected loadparm context");
> - TALLOC_FREE(frame);
> - return NULL;
> - }
> -
> - spdata->creds = cli_credentials_from_py_object(py_creds);
> - if (spdata->creds == NULL) {
> - PyErr_SetString(PyExc_TypeError, "Expected credentials");
> - TALLOC_FREE(frame);
> - return NULL;
> - }
> - spdata->ev_ctx = s4_event_context_init(spdata);
> - if (spdata->ev_ctx == NULL) {
> - PyErr_NoMemory();
> - TALLOC_FREE(frame);
> - return NULL;
> - }
> -
> - lpcfg_smbcli_options(spdata->lp_ctx, &options);
> - lpcfg_smbcli_session_options(spdata->lp_ctx, &session_options);
> -
> - if (ntlmv2_auth != 0xFF) {
> - session_options.ntlmv2_auth = ntlmv2_auth;
> - }
> - if (use_spnego != 0xFF) {
> - options.use_spnego = use_spnego;
> - }
> - if (PyObject_IsTrue(sign)) {
> - options.signing = SMB_SIGNING_REQUIRED;
> - }
> -
> - status = do_smb_connect(spdata, spdata, hostname, service,
> - &options,
> - &session_options,
> - &spdata->tree);
> - PyErr_NTSTATUS_IS_ERR_RAISE(status);
> - if (spdata->tree == NULL) {
> - TALLOC_FREE(frame);
> - return NULL;
> - }
> -
> - smb = pytalloc_steal(type, spdata);
> - TALLOC_FREE(frame);
> - return smb;
> -}
> -
> -static PyTypeObject PySMB = {
> - .tp_name = "smb.SMB",
> - .tp_new = py_smb_new,
> - .tp_flags = Py_TPFLAGS_DEFAULT,
> - .tp_methods = py_smb_methods,
> - .tp_doc = "SMB(hostname, service[, creds[, lp]]) -> SMB connection object\n",
> -
> -};
> -
> -static struct PyModuleDef moduledef = {
> - PyModuleDef_HEAD_INIT,
> - .m_name = "smb",
> - .m_doc = "SMB File I/O support",
> - .m_size = -1,
> - .m_methods = NULL,
> -};
> -
> -void initsmb(void);
> -
> -MODULE_INIT_FUNC(smb)
> -{
> - PyObject *m = NULL;
> -
> - if (pytalloc_BaseObject_PyType_Ready(&PySMB) < 0) {
> - return m;
> - }
> -
> - m = PyModule_Create(&moduledef);
> - if (m == NULL) {
> - return m;
> - }
> -
> - Py_INCREF(&PySMB);
> - PyModule_AddObject(m, "SMB", (PyObject *)&PySMB);
> -
> -#define ADD_FLAGS(val) PyModule_AddObject(m, #val, PyInt_FromLong(val))
> -
> - ADD_FLAGS(FILE_ATTRIBUTE_READONLY);
> - ADD_FLAGS(FILE_ATTRIBUTE_HIDDEN);
> - ADD_FLAGS(FILE_ATTRIBUTE_SYSTEM);
> - ADD_FLAGS(FILE_ATTRIBUTE_VOLUME);
> - ADD_FLAGS(FILE_ATTRIBUTE_DIRECTORY);
> - ADD_FLAGS(FILE_ATTRIBUTE_ARCHIVE);
> - ADD_FLAGS(FILE_ATTRIBUTE_DEVICE);
> - ADD_FLAGS(FILE_ATTRIBUTE_NORMAL);
> - ADD_FLAGS(FILE_ATTRIBUTE_TEMPORARY);
> - ADD_FLAGS(FILE_ATTRIBUTE_SPARSE);
> - ADD_FLAGS(FILE_ATTRIBUTE_REPARSE_POINT);
> - ADD_FLAGS(FILE_ATTRIBUTE_COMPRESSED);
> - ADD_FLAGS(FILE_ATTRIBUTE_OFFLINE);
> - ADD_FLAGS(FILE_ATTRIBUTE_NONINDEXED);
> - ADD_FLAGS(FILE_ATTRIBUTE_ENCRYPTED);
> - ADD_FLAGS(FILE_ATTRIBUTE_ALL_MASK);
> - return m;
> -}
> diff --git a/source4/libcli/wscript_build b/source4/libcli/wscript_build
> index d3641f5..f1bb6bd 100644
> --- a/source4/libcli/wscript_build
> +++ b/source4/libcli/wscript_build
> @@ -42,16 +42,6 @@ bld.SAMBA_SUBSYSTEM('LIBCLI_SMB_COMPOSITE',
> )
>
>
> -for env in bld.gen_python_environments():
> - pytalloc_util = bld.pyembed_libname('pytalloc-util')
> - pyparam_util = bld.pyembed_libname('pyparam_util')
> - bld.SAMBA_PYTHON('pysmb',
> - source='pysmb.c',
> - deps='LIBCLI_SMB_COMPOSITE LIBCLI_SMB2 tevent-util %s %s' % (pytalloc_util, pyparam_util),
> - public_deps='cli_composite samba-credentials gensec LIBCLI_RESOLVE tevent param_options',
> - realname='samba/smb.so'
> - )
> -
> bld.SAMBA_SUBSYSTEM('LIBCLI_DGRAM',
> source='dgram/dgramsocket.c dgram/mailslot.c dgram/netlogon.c dgram/browse.c',
> public_deps='cli-nbt ndr LIBCLI_RESOLVE LIBCLI_NETLOGON LIBCLI_RESOLVE'
> --
> 2.7.4
>
More information about the samba-technical
mailing list