[SCM] Samba Shared Repository - branch master updated

Nadezhda Ivanova nivanova at samba.org
Fri Nov 20 04:24:27 MST 2009


The branch, master has been updated
       via  a760f16... Some changes to allow processing of ldap controls on modify requests.
      from  07e971f... s4:ntvfs/posix/pvfs_acl - Remove unused variable "token"

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


- Log -----------------------------------------------------------------
commit a760f169f4936d7e2677db9229181e2c5ac23bcd
Author: Nadezhda Ivanova <nadezhda.ivanova at postpath.com>
Date:   Fri Nov 20 13:22:38 2009 +0200

    Some changes to allow processing of ldap controls on modify requests.
    
    ldap_backend used to filter out ldap controls on modify. Also, modified
    python binding for ldap_modify to allow writing tests for such controls.

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

Summary of changes:
 source4/ldap_server/ldap_backend.c         |    2 +-
 source4/lib/ldb/common/ldb.c               |   17 ++++++--
 source4/lib/ldb/include/ldb.h              |   18 ++++++++
 source4/lib/ldb/pyldb.c                    |   61 +++++++++++++++++++++++++++-
 source4/scripting/python/pyglue.c          |    6 +++
 source4/scripting/python/samba/__init__.py |   12 ++++-
 6 files changed, 106 insertions(+), 10 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/ldap_server/ldap_backend.c b/source4/ldap_server/ldap_backend.c
index 8c6b8f9..5eabda9 100644
--- a/source4/ldap_server/ldap_backend.c
+++ b/source4/ldap_server/ldap_backend.c
@@ -546,7 +546,7 @@ reply:
 	NT_STATUS_HAVE_NO_MEMORY(modify_reply);
 
 	if (result == LDAP_SUCCESS) {
-		ldb_ret = ldb_modify(samdb, msg);
+		ldb_ret = ldb_modify_ctrl(samdb, msg, call->request->controls);
 		result = map_ldb_error(local_ctx, ldb_ret, &errstr);
 	}
 
diff --git a/source4/lib/ldb/common/ldb.c b/source4/lib/ldb/common/ldb.c
index 20e3206..3a8023a 100644
--- a/source4/lib/ldb/common/ldb.c
+++ b/source4/lib/ldb/common/ldb.c
@@ -1378,10 +1378,11 @@ int ldb_add(struct ldb_context *ldb,
 }
 
 /*
-  modify the specified attributes of a record
+  same as ldb_modify, but accepts controls
 */
-int ldb_modify(struct ldb_context *ldb,
-	       const struct ldb_message *message)
+int ldb_modify_ctrl(struct ldb_context *ldb,
+		    const struct ldb_message *message,
+		    struct ldb_control **controls)
 {
 	struct ldb_request *req;
 	int ret;
@@ -1393,7 +1394,7 @@ int ldb_modify(struct ldb_context *ldb,
 
 	ret = ldb_build_mod_req(&req, ldb, ldb,
 					message,
-					NULL,
+					controls,
 					NULL,
 					ldb_op_default_callback,
 					NULL);
@@ -1406,6 +1407,14 @@ int ldb_modify(struct ldb_context *ldb,
 	talloc_free(req);
 	return ret;
 }
+/*
+  modify the specified attributes of a record
+*/
+int ldb_modify(struct ldb_context *ldb,
+	       const struct ldb_message *message)
+{
+	return ldb_modify_ctrl(ldb, message, NULL);
+}
 
 
 /*
diff --git a/source4/lib/ldb/include/ldb.h b/source4/lib/ldb/include/ldb.h
index 1d0b533..62cd2b8 100644
--- a/source4/lib/ldb/include/ldb.h
+++ b/source4/lib/ldb/include/ldb.h
@@ -1217,6 +1217,24 @@ int ldb_add(struct ldb_context *ldb,
   ldb_init())
   \param message the message containing the changes required.
 
+  \param controls ldap controls for the request
+
+  \return result code (LDB_SUCCESS if the record was modified as
+  requested, otherwise a failure code)
+*/
+int ldb_modify_ctrl(struct ldb_context *ldb,
+		    const struct ldb_message *message,
+		    struct ldb_control **controls);
+
+/**
+  Modify the specified attributes of a record
+
+  This function modifies a record that is in the database.
+
+  \param ldb the context associated with the database (from
+  ldb_init())
+  \param message the message containing the changes required.
+
   \return result code (LDB_SUCCESS if the record was modified as
   requested, otherwise a failure code)
 */
diff --git a/source4/lib/ldb/pyldb.c b/source4/lib/ldb/pyldb.c
index 1f1dcf8..0d1d2fa 100644
--- a/source4/lib/ldb/pyldb.c
+++ b/source4/lib/ldb/pyldb.c
@@ -641,16 +641,73 @@ static PyObject *py_ldb_connect(PyLdbObject *self, PyObject *args, PyObject *kwa
 static PyObject *py_ldb_modify(PyLdbObject *self, PyObject *args)
 {
 	PyObject *py_msg;
+	PyObject *py_controls = Py_None;
+	struct ldb_context *ldb_ctx;
+	struct ldb_request *req;
+	struct ldb_control **parsed_controls;
+	struct ldb_message *msg;
 	int ret;
-	if (!PyArg_ParseTuple(args, "O", &py_msg))
+	if (!PyArg_ParseTuple(args, "O|O", &py_msg, &py_controls))
 		return NULL;
 
+	ldb_ctx = PyLdb_AsLdbContext(self);
+
+	if (py_controls == Py_None) {
+		parsed_controls = NULL;
+	} else {
+		const char **controls = PyList_AsStringList(ldb_ctx, py_controls, "controls");
+		parsed_controls = ldb_parse_control_strings(ldb_ctx, ldb_ctx, controls);
+		talloc_free(controls);
+	}
+
 	if (!PyLdbMessage_Check(py_msg)) {
 		PyErr_SetString(PyExc_TypeError, "Expected Ldb Message");
 		return NULL;
 	}
+	msg = PyLdbMessage_AsMessage(py_msg);
+
+	ret = ldb_msg_sanity_check(ldb_ctx, msg);
+        if (ret != LDB_SUCCESS) {
+		PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, PyLdb_AsLdbContext(self));
+		return NULL;
+        }
 
-	ret = ldb_modify(PyLdb_AsLdbContext(self), PyLdbMessage_AsMessage(py_msg));
+        ret = ldb_build_mod_req(&req, ldb_ctx, ldb_ctx,
+                                        msg,
+                                        parsed_controls,
+                                        NULL,
+                                        ldb_op_default_callback,
+                                        NULL);
+
+        if (ret != LDB_SUCCESS) {
+		PyErr_SetString(PyExc_TypeError, "failed to build request");
+		return NULL;
+	}
+
+        /* do request and autostart a transaction */
+	/* Then let's LDB handle the message error in case of pb as they are meaningful */
+
+        ret = ldb_transaction_start(ldb_ctx);
+        if (ret != LDB_SUCCESS) {
+		talloc_free(req);
+		PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, PyLdb_AsLdbContext(self));
+        }
+
+        ret = ldb_request(ldb_ctx, req);
+        if (ret == LDB_SUCCESS) {
+                ret = ldb_wait(req->handle, LDB_WAIT_ALL);
+        }
+
+	if (ret == LDB_SUCCESS) {
+                ret = ldb_transaction_commit(ldb_ctx);
+        } else {
+		ldb_transaction_cancel(ldb_ctx);
+		if (ldb_ctx->err_string == NULL) {
+			/* no error string was setup by the backend */
+			ldb_asprintf_errstring(ldb_ctx, "%s (%d)", ldb_strerror(ret), ret);
+		}
+	}
+	talloc_free(req);
 	PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, PyLdb_AsLdbContext(self));
 
 	Py_RETURN_NONE;
diff --git a/source4/scripting/python/pyglue.c b/source4/scripting/python/pyglue.c
index b138e3e..9f01102 100644
--- a/source4/scripting/python/pyglue.c
+++ b/source4/scripting/python/pyglue.c
@@ -566,6 +566,12 @@ void initglue(void)
 	PyModule_AddObject(m, "DS_DC_FUNCTION_2008", PyInt_FromLong(DS_DC_FUNCTION_2008));
 	PyModule_AddObject(m, "DS_DC_FUNCTION_2008_R2", PyInt_FromLong(DS_DC_FUNCTION_2008_R2));
 
+	/* "LDAP_SERVER_SD_FLAGS_OID" */
+	PyModule_AddObject(m, "SECINFO_OWNER", PyInt_FromLong(SECINFO_OWNER));
+	PyModule_AddObject(m, "SECINFO_GROUP", PyInt_FromLong(SECINFO_GROUP));
+	PyModule_AddObject(m, "SECINFO_DACL", PyInt_FromLong(SECINFO_DACL));
+	PyModule_AddObject(m, "SECINFO_SACL", PyInt_FromLong(SECINFO_SACL));
+
 	/* one of the most annoying things about python scripts is
  	   that they don't die when you hit control-C. This fixes that
  	   sillyness. As we do all database operations using
diff --git a/source4/scripting/python/samba/__init__.py b/source4/scripting/python/samba/__init__.py
index 06e276c..f74304c 100644
--- a/source4/scripting/python/samba/__init__.py
+++ b/source4/scripting/python/samba/__init__.py
@@ -241,7 +241,7 @@ class Ldb(ldb.Ldb):
         """
         self.add_ldif(open(ldif_path, 'r').read())
 
-    def add_ldif(self, ldif,controls=None):
+    def add_ldif(self, ldif, controls=None):
         """Add data based on a LDIF string.
 
         :param ldif: LDIF text.
@@ -250,13 +250,13 @@ class Ldb(ldb.Ldb):
             assert changetype == ldb.CHANGETYPE_NONE
             self.add(msg,controls)
 
-    def modify_ldif(self, ldif):
+    def modify_ldif(self, ldif, controls=None):
         """Modify database based on a LDIF string.
 
         :param ldif: LDIF text.
         """
         for changetype, msg in self.parse_ldif(ldif):
-            self.modify(msg)
+            self.modify(msg, controls)
 
     def set_domain_sid(self, sid):
         """Change the domain SID used by this LDB.
@@ -423,3 +423,9 @@ DS_DC_FUNCTION_2003 = glue.DS_DC_FUNCTION_2003
 DS_DC_FUNCTION_2008 = glue.DS_DC_FUNCTION_2008
 DS_DC_FUNCTION_2008_R2 = glue.DS_DC_FUNCTION_2008_R2
 
+#LDAP_SERVER_SD_FLAGS_OID flags
+SECINFO_OWNER = glue.SECINFO_OWNER
+SECINFO_GROUP = glue.SECINFO_GROUP
+SECINFO_DACL  = glue.SECINFO_DACL
+SECINFO_SACL  = glue.SECINFO_SACL
+


-- 
Samba Shared Repository


More information about the samba-cvs mailing list