The branch, master has been updated
       via  05425fc... s4-drs: replace manual checks with 
dsdb_modify_permissive()
       via  2908f21... s4-drs: use a permissive modify in addentry
       via  4694b46... s4-dsdb: added dsdb_modify_permissive()
      from  6ec6fa0... s3: eventlogadm.c: add -s option to use alternative 
config file.

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


- Log -----------------------------------------------------------------
commit 05425fcf14f0695e5e230a698885203cc7c7ab2b
Author: Andrew Tridgell <tri...@samba.org>
Date:   Mon Feb 15 17:39:20 2010 +1100

    s4-drs: replace manual checks with dsdb_modify_permissive()
    
    Much simpler to use the permissive control instead of manually munging
    the SPN list.

commit 2908f21c65ad8385f645cd841a25fe0f8f45feb0
Author: Andrew Tridgell <tri...@samba.org>
Date:   Mon Feb 15 17:38:47 2010 +1100

    s4-drs: use a permissive modify in addentry
    
    It is not an error if entries already exist.

commit 4694b4677ac58cd99d005d33aaf8c1b154e63b29
Author: Andrew Tridgell <tri...@samba.org>
Date:   Mon Feb 15 17:38:16 2010 +1100

    s4-dsdb: added dsdb_modify_permissive()
    
    This will be used in the drsuapi server

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

Summary of changes:
 source4/dsdb/common/util.c            |   36 +++++++++++++++++++++++++++++++++
 source4/rpc_server/drsuapi/addentry.c |    2 +-
 source4/rpc_server/drsuapi/writespn.c |   33 +-----------------------------
 3 files changed, 38 insertions(+), 33 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c
index d659767..eb021df 100644
--- a/source4/dsdb/common/util.c
+++ b/source4/dsdb/common/util.c
@@ -3360,3 +3360,39 @@ int dsdb_load_udv_v1(struct ldb_context *samdb, struct 
ldb_dn *dn, TALLOC_CTX *m
        talloc_free(v2);
        return LDB_SUCCESS;
 }
+
+
+/*
+  a modify with the 'permissive' control
+  this means no error for entries that already exist on adds, or
+  removal of entries that don't exist
+*/
+int dsdb_modify_permissive(struct ldb_context *ldb,
+                          const struct ldb_message *message)
+{
+       struct ldb_request *req;
+       int ret;
+
+       ret = ldb_build_mod_req(&req, ldb, ldb,
+                               message,
+                               NULL,
+                               NULL,
+                               ldb_op_default_callback,
+                               NULL);
+
+       if (ret != LDB_SUCCESS) return ret;
+
+       ret = ldb_request_add_control(req, LDB_CONTROL_PERMISSIVE_MODIFY_OID, 
false, NULL);
+       if (ret != LDB_SUCCESS) {
+               talloc_free(req);
+               return ret;
+       }
+
+       ret = ldb_request(ldb, req);
+       if (ret == LDB_SUCCESS) {
+               ret = ldb_wait(req->handle, LDB_WAIT_ALL);
+       }
+
+       talloc_free(req);
+       return ret;
+}
diff --git a/source4/rpc_server/drsuapi/addentry.c 
b/source4/rpc_server/drsuapi/addentry.c
index f63a967..b1c361d 100644
--- a/source4/rpc_server/drsuapi/addentry.c
+++ b/source4/rpc_server/drsuapi/addentry.c
@@ -128,7 +128,7 @@ static WERROR drsuapi_add_SPNs(struct drsuapi_bind_state 
*b_state,
                        return WERR_NOMEM;
                }
 
-               ret = ldb_modify(b_state->sam_ctx, msg);
+               ret = dsdb_modify_permissive(b_state->sam_ctx, msg);
                if (ret != LDB_SUCCESS) {
                        DEBUG(0,(__location__ ": Failed to add SPNs - %s\n",
                                 ldb_errstring(b_state->sam_ctx)));
diff --git a/source4/rpc_server/drsuapi/writespn.c 
b/source4/rpc_server/drsuapi/writespn.c
index 8e20c88..65a7183 100644
--- a/source4/rpc_server/drsuapi/writespn.c
+++ b/source4/rpc_server/drsuapi/writespn.c
@@ -47,9 +47,6 @@ WERROR dcesrv_drsuapi_DsWriteAccountSpn(struct 
dcesrv_call_state *dce_call, TALL
                        struct drsuapi_DsWriteAccountSpnRequest1 *req;
                        struct ldb_message *msg;
                        int count, i, ret;
-                       struct ldb_result *res;
-                       const char *attrs[] = { "servicePrincipalName", NULL };
-                       struct ldb_message_element *el;
                        unsigned spn_count=0;
 
                        req = &r->in.req->req1;
@@ -66,35 +63,8 @@ WERROR dcesrv_drsuapi_DsWriteAccountSpn(struct 
dcesrv_call_state *dce_call, TALL
                                return WERR_OK;
                        }
 
-                       /* load the existing SPNs, as these are
-                        * ignored for adds and deletes (see MS-DRSR
-                        * section 4.1.28.3)
-                        */
-                       ret = ldb_search(b_state->sam_ctx, msg, &res, msg->dn, 
LDB_SCOPE_BASE,
-                                        attrs, NULL);
-                       if (ret != LDB_SUCCESS) {
-                               DEBUG(0,("Failed to load existing SPNs on %s: 
%s\n",
-                                        ldb_dn_get_linearized(msg->dn),
-                                        ldb_errstring(b_state->sam_ctx)));
-                               r->out.res->res1.status = WERR_DS_OBJ_NOT_FOUND;
-                               return WERR_OK;
-                       }
-                       el = ldb_msg_find_element(res->msgs[0], 
"servicePrincipalName");
-
                        /* construct mods */
                        for (i = 0; i < count; i++) {
-                               bool found = false;
-                               int j;
-                               for (j=0; el && j<el->num_values; j++) {
-                                       if 
(samdb_ldb_val_case_cmp(req->spn_names[i].str, &el->values[j]) == 0) {
-                                               found = true;
-                                               break;
-                                       }
-                               }
-                               if ((req->operation == 
DRSUAPI_DS_SPN_OPERATION_ADD && found) ||
-                                   (req->operation == 
DRSUAPI_DS_SPN_OPERATION_DELETE && !found)) {
-                                       continue;
-                               }
                                ret = samdb_msg_add_string(b_state->sam_ctx,
                                                           msg, msg, 
"servicePrincipalName",
                                                           
req->spn_names[i].str);
@@ -125,8 +95,7 @@ WERROR dcesrv_drsuapi_DsWriteAccountSpn(struct 
dcesrv_call_state *dce_call, TALL
                        }
 
                        /* Apply to database */
-
-                       ret = ldb_modify(b_state->sam_ctx, msg);
+                       ret = dsdb_modify_permissive(b_state->sam_ctx, msg);
                        if (ret != 0) {
                                DEBUG(0,("Failed to modify SPNs on %s: %s\n",
                                         ldb_dn_get_linearized(msg->dn),


-- 
Samba Shared Repository

Reply via email to