From: Ralph Boehme Date: Tue, 17 Dec 2019 13:57:53 +0000 (+0100) Subject: pysmbd: add "session_info" arg to py_smbd_mkdir() X-Git-Tag: ldb-2.1.0~158 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7121d475794b951d9bee13d50e6be125f8cc7c2f;p=thirdparty%2Fsamba.git pysmbd: add "session_info" arg to py_smbd_mkdir() Signed-off-by: Ralph Boehme Reviewed-by: Stefan Metzmacher --- diff --git a/python/samba/ntacls.py b/python/samba/ntacls.py index f2d7c9d5435..fe6eda269fc 100644 --- a/python/samba/ntacls.py +++ b/python/samba/ntacls.py @@ -564,7 +564,7 @@ def backup_offline(src_service_path, dest_tarfile_path, samdb_conn, smb_conf_pat src = os.path.join(dirpath, dirname) dst = os.path.join(dst_dirpath, dirname) # mkdir with metadata - smbd.mkdir(dst, service) + smbd.mkdir(dst, session_info, service) ntacl_sddl_str = ntacls_helper.getntacl(src, session_info, as_sddl=True) _create_ntacl_file(dst, ntacl_sddl_str) @@ -621,7 +621,7 @@ def backup_restore(src_tarfile_path, dst_service_path, samdb_conn, smb_conf_path dst = os.path.join(dst_dirpath, dirname) if not os.path.isdir(dst): # dst must be absolute path for smbd API - smbd.mkdir(dst, service) + smbd.mkdir(dst, session_info, service) ntacl_sddl_str = _read_ntacl_file(src) if ntacl_sddl_str: diff --git a/python/samba/tests/ntacls_backup.py b/python/samba/tests/ntacls_backup.py index 22bebc99c86..d072049cf95 100644 --- a/python/samba/tests/ntacls_backup.py +++ b/python/samba/tests/ntacls_backup.py @@ -111,7 +111,7 @@ class NtaclsBackupRestoreTests(SmbdBaseTests): """ dirpath = os.path.join(self.service_root, 'a-dir') - smbd.mkdir(dirpath, self.service) + smbd.mkdir(dirpath, system_session_unix(), self.service) mode = os.stat(dirpath).st_mode # This works in conjunction with the TEST_UMASK in smbd_base diff --git a/source3/smbd/pysmbd.c b/source3/smbd/pysmbd.c index f28acd93f77..2fc197f91ff 100644 --- a/source3/smbd/pysmbd.c +++ b/source3/smbd/pysmbd.c @@ -971,10 +971,13 @@ static PyObject *py_smbd_mkdir(PyObject *self, PyObject *args, PyObject *kwargs) { const char * const kwnames[] = { "fname", + "session_info", "service", NULL }; char *fname, *service = NULL; + PyObject *py_session = Py_None; + struct auth_session_info *session_info = NULL; TALLOC_CTX *frame = talloc_stackframe(); struct connection_struct *conn = NULL; struct smb_filename *smb_fname = NULL; @@ -983,16 +986,33 @@ static PyObject *py_smbd_mkdir(PyObject *self, PyObject *args, PyObject *kwargs) if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "s|z", + "sO|z", discard_const_p(char *, kwnames), &fname, + &py_session, &service)) { TALLOC_FREE(frame); return NULL; } - conn = get_conn_tos(service, NULL); + if (!py_check_dcerpc_type(py_session, + "samba.dcerpc.auth", + "session_info")) { + TALLOC_FREE(frame); + return NULL; + } + session_info = pytalloc_get_type(py_session, + struct auth_session_info); + if (session_info == NULL) { + PyErr_Format(PyExc_TypeError, + "Expected auth_session_info for session_info argument got %s", + pytalloc_get_name(py_session)); + TALLOC_FREE(frame); + return NULL; + } + + conn = get_conn_tos(service, session_info); if (!conn) { TALLOC_FREE(frame); return NULL;