[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