s4-dsdb Add ability to force a particular SID in the upgrade case
authorAndrew Bartlett <abartlet@samba.org>
Thu, 11 Aug 2011 05:46:26 +0000 (15:46 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Sat, 13 Aug 2011 02:30:49 +0000 (12:30 +1000)
source3/passdb/pdb_samba4.c
source4/dsdb/common/util_samr.c
source4/rpc_server/samr/dcesrv_samr.c

index 5848c23de8e1dd8eea79cbc2e1beffe0c6eb7d90..aa3352a65887a130c19c4eaaf0d9e7633c3e010e 100644 (file)
@@ -580,7 +580,8 @@ static NTSTATUS pdb_samba4_create_user(struct pdb_methods *m,
 
        /* Internally this uses transactions to ensure all the steps
         * happen or fail as one */
-       status = dsdb_add_user(state->ldb, tmp_ctx, name, acct_flags, &sid, &dn);
+       status = dsdb_add_user(state->ldb, tmp_ctx, name, acct_flags, NULL,
+                              &sid, &dn);
        if (!NT_STATUS_IS_OK(status)) {
                talloc_free(tmp_ctx);
                return status;
index 83a8c385af601146d50b11d4859bd454c8410895..3ce8d76018da191bb004596b470cffea6ee78347 100644 (file)
@@ -36,6 +36,7 @@ NTSTATUS dsdb_add_user(struct ldb_context *ldb,
                       TALLOC_CTX *mem_ctx,
                       const char *account_name,
                       uint32_t acct_flags,
+                      const struct dom_sid *forced_sid,
                       struct dom_sid **sid,
                       struct ldb_dn **dn)
 {
@@ -143,6 +144,18 @@ NTSTATUS dsdb_add_user(struct ldb_context *ldb,
        ldb_msg_add_string(msg, "sAMAccountName", account_name);
        ldb_msg_add_string(msg, "objectClass", obj_class);
 
+       /* This is only here for migrations using pdb_samba4, the
+        * caller and the samldb are responsible for ensuring it makes
+        * sense */
+       if (forced_sid) {
+               ret = samdb_msg_add_dom_sid(ldb, msg, msg, "objectSID", forced_sid);
+               if (ret != LDB_SUCCESS) {
+                       ldb_transaction_cancel(ldb);
+                       talloc_free(tmp_ctx);
+                       return NT_STATUS_INTERNAL_ERROR;
+               }
+       }
+
        /* create the user */
        ret = ldb_add(ldb, msg);
        switch (ret) {
@@ -244,7 +257,9 @@ NTSTATUS dsdb_add_user(struct ldb_context *ldb,
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
        }
        *dn = talloc_steal(mem_ctx, account_dn);
-       *sid = talloc_steal(mem_ctx, account_sid);
+       if (sid) {
+               *sid = talloc_steal(mem_ctx, account_sid);
+       }
        talloc_free(tmp_ctx);
        return NT_STATUS_OK;
 }
index 32aafcd23faa88660c275396b7f69117cb92ee62..7d062ffff411a66286fdfb4e2901ae830761c6e3 100644 (file)
@@ -1205,7 +1205,8 @@ static NTSTATUS dcesrv_samr_CreateUser2(struct dcesrv_call_state *dce_call, TALL
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       status = dsdb_add_user(d_state->sam_ctx, mem_ctx, account_name, r->in.acct_flags, &sid, &dn);
+       status = dsdb_add_user(d_state->sam_ctx, mem_ctx, account_name, r->in.acct_flags, NULL,
+                              &sid, &dn);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }