ldb_map objectClass munging: Don't hard-code 'extensibleObject'.
[samba.git] / source4 / dsdb / samdb / ldb_modules / password_hash.c
index eecec6a55bf1bf8cbaccfab5623b6dc09a4d77da..57c053d961829ce678d41a99e394f44e21e36211 100644 (file)
@@ -32,8 +32,9 @@
  */
 
 #include "includes.h"
-#include "libcli/ldap/ldap.h"
+#include "libcli/ldap/ldap_ndr.h"
 #include "ldb/include/ldb_errors.h"
+#include "ldb/include/ldb.h"
 #include "ldb/include/ldb_private.h"
 #include "librpc/gen_ndr/misc.h"
 #include "librpc/gen_ndr/samr.h"
@@ -472,7 +473,7 @@ static int setup_primary_kerberos(struct setup_password_fields_io *io,
                talloc_steal(io->ac, blob.data);
 
                /* TODO: use ndr_pull_struct_blob_all(), when the ndr layer handles it correct with relative pointers */
-               ndr_err = ndr_pull_struct_blob(&blob, io->ac, &_old_pkb,
+               ndr_err = ndr_pull_struct_blob(&blob, io->ac, lp_iconv_convenience(ldb_get_opaque(io->ac->module->ldb, "loadparm")), &_old_pkb,
                                               (ndr_pull_flags_fn_t)ndr_pull_package_PrimaryKerberosBlob);
                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                        NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
@@ -879,7 +880,7 @@ static int setup_supplemental_field(struct setup_password_fields_io *io)
 
        /* if there's an old supplementaCredentials blob then parse it */
        if (io->o.supplemental) {
-               ndr_err = ndr_pull_struct_blob_all(io->o.supplemental, io->ac, &_old_scb,
+               ndr_err = ndr_pull_struct_blob_all(io->o.supplemental, io->ac, lp_iconv_convenience(ldb_get_opaque(io->ac->module->ldb, "loadparm")), &_old_scb,
                                                   (ndr_pull_flags_fn_t)ndr_pull_supplementalCredentialsBlob);
                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                        NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
@@ -912,7 +913,9 @@ static int setup_supplemental_field(struct setup_password_fields_io *io)
                return ret;
        }
 
-       ndr_err = ndr_push_struct_blob(&pkb_blob, io->ac, &pkb,
+       ndr_err = ndr_push_struct_blob(&pkb_blob, io->ac, 
+                                      lp_iconv_convenience(ldb_get_opaque(io->ac->module->ldb, "loadparm")),
+                                      &pkb,
                                       (ndr_push_flags_fn_t)ndr_push_package_PrimaryKerberosBlob);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
@@ -951,7 +954,9 @@ static int setup_supplemental_field(struct setup_password_fields_io *io)
                return ret;
        }
 
-       ndr_err = ndr_push_struct_blob(&pdb_blob, io->ac, &pdb,
+       ndr_err = ndr_push_struct_blob(&pdb_blob, io->ac, 
+                                      lp_iconv_convenience(ldb_get_opaque(io->ac->module->ldb, "loadparm")),
+                                      &pdb,
                                       (ndr_push_flags_fn_t)ndr_push_package_PrimaryWDigestBlob);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
@@ -978,7 +983,9 @@ static int setup_supplemental_field(struct setup_password_fields_io *io)
 
                pcb.cleartext   = io->n.cleartext;
 
-               ndr_err = ndr_push_struct_blob(&pcb_blob, io->ac, &pcb,
+               ndr_err = ndr_push_struct_blob(&pcb_blob, io->ac, 
+                                              lp_iconv_convenience(ldb_get_opaque(io->ac->module->ldb, "loadparm")),
+                                              &pcb,
                                               (ndr_push_flags_fn_t)ndr_push_package_PrimaryCLEARTEXTBlob);
                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                        NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
@@ -1001,7 +1008,9 @@ static int setup_supplemental_field(struct setup_password_fields_io *io)
        /*
         * setup 'Packages' element
         */
-       ndr_err = ndr_push_struct_blob(&pb_blob, io->ac, &pb,
+       ndr_err = ndr_push_struct_blob(&pb_blob, io->ac, 
+                                      lp_iconv_convenience(ldb_get_opaque(io->ac->module->ldb, "loadparm")), 
+                                      &pb,
                                       (ndr_push_flags_fn_t)ndr_push_package_PackagesBlob);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
@@ -1026,7 +1035,9 @@ static int setup_supplemental_field(struct setup_password_fields_io *io)
        scb.sub.num_packages    = num_packages;
        scb.sub.packages        = packages;
 
-       ndr_err = ndr_push_struct_blob(&io->g.supplemental, io->ac, &scb,
+       ndr_err = ndr_push_struct_blob(&io->g.supplemental, io->ac, 
+                                      lp_iconv_convenience(ldb_get_opaque(io->ac->module->ldb, "loadparm")),
+                                      &scb,
                                       (ndr_push_flags_fn_t)ndr_push_supplementalCredentialsBlob);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
@@ -1432,6 +1443,7 @@ static int password_hash_add_do_add(struct ldb_handle *h) {
        /* Some operations below require kerberos contexts */
        if (smb_krb5_init_context(ac->down_req, 
                                  ldb_get_opaque(h->module->ldb, "EventContext"), 
+                                 (struct loadparm_context *)ldb_get_opaque(h->module->ldb, "loadparm"), 
                                  &smb_krb5_context) != 0) {
                return LDB_ERR_OPERATIONS_ERROR;
        }
@@ -1759,6 +1771,7 @@ static int password_hash_mod_do_mod(struct ldb_handle *h) {
        /* Some operations below require kerberos contexts */
        if (smb_krb5_init_context(ac->mod_req, 
                                  ldb_get_opaque(h->module->ldb, "EventContext"), 
+                                 (struct loadparm_context *)ldb_get_opaque(h->module->ldb, "loadparm"), 
                                  &smb_krb5_context) != 0) {
                return LDB_ERR_OPERATIONS_ERROR;
        }