[PATCH] Remove s4 SMB client python bindings

Tim Beale timbeale at catalyst.net.nz
Fri Jan 25 00:34:07 UTC 2019


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

-------------- next part --------------
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