r26233: Pass loadparm context when creating krb5 contexts.
[jelmer/samba4-debian.git] / source / dsdb / samdb / ldb_modules / password_hash.c
index a275810b12fcb9709b420c5e6a7c55a8a9d73fc8..529b1aa96fecef1350519d0b23f7124dc5e396a3 100644 (file)
@@ -48,6 +48,7 @@
 #include "librpc/ndr/libndr.h"
 #include "librpc/gen_ndr/ndr_drsblobs.h"
 #include "lib/crypto/crypto.h"
+#include "param/param.h"
 
 /* If we have decided there is reason to work on this request, then
  * setup all the password hash types correctly.
@@ -91,7 +92,7 @@ struct ph_context {
 };
 
 struct domain_data {
-       BOOL store_cleartext;
+       bool store_cleartext;
        uint_t pwdProperties;
        uint_t pwdHistoryLength;
        char *netbios_domain;
@@ -228,7 +229,7 @@ static int setup_primary_kerberos(struct setup_password_fields_io *io,
        struct package_PrimaryKerberosBlob _old_pkb;
        struct package_PrimaryKerberosCtr3 *old_pkb3 = NULL;
        uint32_t i;
-       NTSTATUS status;
+       enum ndr_err_code ndr_err;
 
        /* Many, many thanks to lukeh@padl.com for this
         * algorithm, described in his Nov 10 2004 mail to
@@ -340,7 +341,7 @@ static int setup_primary_kerberos(struct setup_password_fields_io *io,
                return LDB_ERR_OPERATIONS_ERROR;
        }
 
-       if (lp_parm_bool(-1, "password_hash", "create_aes_key", false)) {
+       if (lp_parm_bool(ldb_get_opaque(io->ac->module->ldb, "loadparm"), NULL, "password_hash", "create_aes_key", false)) {
        /*
         * TODO:
         *
@@ -471,9 +472,10 @@ 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 */
-               status = ndr_pull_struct_blob(&blob, io->ac, &_old_pkb,
-                                             (ndr_pull_flags_fn_t)ndr_pull_package_PrimaryKerberosBlob);
-               if (!NT_STATUS_IS_OK(status)) {
+               ndr_err = ndr_pull_struct_blob(&blob, io->ac, &_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);
                        ldb_asprintf_errstring(io->ac->module->ldb,
                                               "setup_primary_kerberos: "
                                               "failed to pull old package_PrimaryKerberosBlob: %s",
@@ -862,7 +864,7 @@ static int setup_supplemental_field(struct setup_password_fields_io *io)
        DATA_BLOB pcb_blob;
        char *pcb_hexstr;
        int ret;
-       NTSTATUS status;
+       enum ndr_err_code ndr_err;
        uint8_t zero16[16];
 
        ZERO_STRUCT(zero16);
@@ -877,9 +879,10 @@ 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) {
-               status = ndr_pull_struct_blob_all(io->o.supplemental, io->ac, &_old_scb,
-                                                 (ndr_pull_flags_fn_t)ndr_pull_supplementalCredentialsBlob);
-               if (!NT_STATUS_IS_OK(status)) {
+               ndr_err = ndr_pull_struct_blob_all(io->o.supplemental, io->ac, &_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);
                        ldb_asprintf_errstring(io->ac->module->ldb,
                                               "setup_supplemental_field: "
                                               "failed to pull old supplementalCredentialsBlob: %s",
@@ -909,9 +912,10 @@ static int setup_supplemental_field(struct setup_password_fields_io *io)
                return ret;
        }
 
-       status = ndr_push_struct_blob(&pkb_blob, io->ac, &pkb,
-                                     (ndr_push_flags_fn_t)ndr_push_package_PrimaryKerberosBlob);
-       if (!NT_STATUS_IS_OK(status)) {
+       ndr_err = ndr_push_struct_blob(&pkb_blob, io->ac, &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);
                ldb_asprintf_errstring(io->ac->module->ldb,
                                       "setup_supplemental_field: "
                                       "failed to push package_PrimaryKerberosBlob: %s",
@@ -947,9 +951,10 @@ static int setup_supplemental_field(struct setup_password_fields_io *io)
                return ret;
        }
 
-       status = ndr_push_struct_blob(&pdb_blob, io->ac, &pdb,
-                                     (ndr_push_flags_fn_t)ndr_push_package_PrimaryWDigestBlob);
-       if (!NT_STATUS_IS_OK(status)) {
+       ndr_err = ndr_push_struct_blob(&pdb_blob, io->ac, &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);
                ldb_asprintf_errstring(io->ac->module->ldb,
                                       "setup_supplemental_field: "
                                       "failed to push package_PrimaryWDigestBlob: %s",
@@ -973,9 +978,10 @@ static int setup_supplemental_field(struct setup_password_fields_io *io)
 
                pcb.cleartext   = io->n.cleartext;
 
-               status = ndr_push_struct_blob(&pcb_blob, io->ac, &pcb,
-                                             (ndr_push_flags_fn_t)ndr_push_package_PrimaryCLEARTEXTBlob);
-               if (!NT_STATUS_IS_OK(status)) {
+               ndr_err = ndr_push_struct_blob(&pcb_blob, io->ac, &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);
                        ldb_asprintf_errstring(io->ac->module->ldb,
                                               "setup_supplemental_field: "
                                               "failed to push package_PrimaryCLEARTEXTBlob: %s",
@@ -995,9 +1001,10 @@ static int setup_supplemental_field(struct setup_password_fields_io *io)
        /*
         * setup 'Packages' element
         */
-       status = ndr_push_struct_blob(&pb_blob, io->ac, &pb,
-                                     (ndr_push_flags_fn_t)ndr_push_package_PackagesBlob);
-       if (!NT_STATUS_IS_OK(status)) {
+       ndr_err = ndr_push_struct_blob(&pb_blob, io->ac, &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);
                ldb_asprintf_errstring(io->ac->module->ldb,
                                       "setup_supplemental_field: "
                                       "failed to push package_PackagesBlob: %s",
@@ -1019,9 +1026,10 @@ static int setup_supplemental_field(struct setup_password_fields_io *io)
        scb.sub.num_packages    = num_packages;
        scb.sub.packages        = packages;
 
-       status = ndr_push_struct_blob(&io->g.supplemental, io->ac, &scb,
-                                     (ndr_push_flags_fn_t)ndr_push_supplementalCredentialsBlob);
-       if (!NT_STATUS_IS_OK(status)) {
+       ndr_err = ndr_push_struct_blob(&io->g.supplemental, io->ac, &scb,
+                                      (ndr_push_flags_fn_t)ndr_push_supplementalCredentialsBlob);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
                ldb_asprintf_errstring(io->ac->module->ldb,
                                       "setup_supplemental_field: "
                                       "failed to push supplementalCredentialsBlob: %s",
@@ -1424,6 +1432,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;
        }
@@ -1751,6 +1760,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;
        }