s3-talloc Change TALLOC_ZERO_P() to talloc_zero()
[nivanova/samba-autobuild/.git] / source3 / libnet / libnet_dssync_keytab.c
index 71fc7147df527a65d5fafcfd33ee6ea4005b7baf..06758b4510d40bc407152023202818fa9fc6e757 100644 (file)
 */
 
 #include "includes.h"
-#include "libnet/libnet.h"
+#include "smb_krb5.h"
+#include "ads.h"
+#include "libnet/libnet_dssync.h"
+#include "libnet/libnet_keytab.h"
 #include "librpc/gen_ndr/ndr_drsblobs.h"
 
-#if defined(HAVE_ADS) && defined(ENCTYPE_ARCFOUR_HMAC)
-
-/**
- * Internal helper function to add data to the list
- * of keytab entries. It builds the prefix from the input.
- */
-static NTSTATUS add_to_keytab_entries(TALLOC_CTX *mem_ctx,
-                                     struct libnet_keytab_context *ctx,
-                                     uint32_t kvno,
-                                     const char *name,
-                                     const char *prefix,
-                                     const krb5_enctype enctype,
-                                     DATA_BLOB blob)
-{
-       struct libnet_keytab_entry entry;
-
-       entry.kvno = kvno;
-       entry.name = talloc_strdup(mem_ctx, name);
-       entry.principal = talloc_asprintf(mem_ctx, "%s%s%s@%s",
-                                         prefix ? prefix : "",
-                                         prefix ? "/" : "",
-                                         name, ctx->dns_domain_name);
-       entry.enctype = enctype;
-       entry.password = blob;
-       NT_STATUS_HAVE_NO_MEMORY(entry.name);
-       NT_STATUS_HAVE_NO_MEMORY(entry.principal);
-       NT_STATUS_HAVE_NO_MEMORY(entry.password.data);
-
-       ADD_TO_ARRAY(mem_ctx, struct libnet_keytab_entry, entry,
-                    &ctx->entries, &ctx->count);
-       NT_STATUS_HAVE_NO_MEMORY(ctx->entries);
-
-       return NT_STATUS_OK;
-}
+#if defined(HAVE_ADS)
 
 static NTSTATUS keytab_startup(struct dssync_context *ctx, TALLOC_CTX *mem_ctx,
                               struct replUpToDateVectorBlob **pold_utdv)
@@ -85,12 +55,11 @@ static NTSTATUS keytab_startup(struct dssync_context *ctx, TALLOC_CTX *mem_ctx,
                enum ndr_err_code ndr_err;
                old_utdv = talloc(mem_ctx, struct replUpToDateVectorBlob);
 
-               ndr_err = ndr_pull_struct_blob(&entry->password, old_utdv,
-                               old_utdv,
+               ndr_err = ndr_pull_struct_blob(&entry->password, old_utdv, old_utdv,
                                (ndr_pull_flags_fn_t)ndr_pull_replUpToDateVectorBlob);
                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                        NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
-                       ctx->error_message = talloc_asprintf(mem_ctx,
+                       ctx->error_message = talloc_asprintf(ctx,
                                        "Failed to pull UpToDateVector: %s",
                                        nt_errstr(status));
                        return status;
@@ -128,16 +97,16 @@ static NTSTATUS keytab_finish(struct dssync_context *ctx, TALLOC_CTX *mem_ctx,
                                (ndr_push_flags_fn_t)ndr_push_replUpToDateVectorBlob);
                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                        status = ndr_map_error2ntstatus(ndr_err);
-                       ctx->error_message = talloc_asprintf(mem_ctx,
+                       ctx->error_message = talloc_asprintf(ctx,
                                        "Failed to push UpToDateVector: %s",
                                        nt_errstr(status));
                        goto done;
                }
 
-               status = add_to_keytab_entries(mem_ctx, keytab_ctx, 0,
-                                              ctx->nc_dn, "UTDV",
-                                              ENCTYPE_NULL,
-                                              blob);
+               status = libnet_keytab_add_to_keytab_entries(mem_ctx, keytab_ctx, 0,
+                                                            ctx->nc_dn, "UTDV",
+                                                            ENCTYPE_NULL,
+                                                            blob);
                if (!NT_STATUS_IS_OK(status)) {
                        goto done;
                }
@@ -146,13 +115,13 @@ static NTSTATUS keytab_finish(struct dssync_context *ctx, TALLOC_CTX *mem_ctx,
        ret = libnet_keytab_add(keytab_ctx);
        if (ret) {
                status = krb5_to_nt_status(ret);
-               ctx->error_message = talloc_asprintf(mem_ctx,
+               ctx->error_message = talloc_asprintf(ctx,
                        "Failed to add entries to keytab %s: %s",
                        keytab_ctx->keytab_name, error_message(ret));
                goto done;
        }
 
-       ctx->result_message = talloc_asprintf(mem_ctx,
+       ctx->result_message = talloc_asprintf(ctx,
                "Vampired %d accounts to keytab %s",
                keytab_ctx->count,
                keytab_ctx->keytab_name);
@@ -231,7 +200,7 @@ static  NTSTATUS parse_supplemental_credentials(TALLOC_CTX *mem_ctx,
                goto done;
        }
 
-       pkb = TALLOC_ZERO_P(mem_ctx, struct package_PrimaryKerberosBlob);
+       pkb = talloc_zero(mem_ctx, struct package_PrimaryKerberosBlob);
        if (!pkb) {
                status = NT_STATUS_NO_MEMORY;
                goto done;
@@ -304,10 +273,10 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
 
                attr = &cur->object.attribute_ctr.attributes[i];
 
-               if (attr->attid == DRSUAPI_ATTRIBUTE_servicePrincipalName) {
+               if (attr->attid == DRSUAPI_ATTID_servicePrincipalName) {
                        uint32_t count;
                        num_spns = attr->value_ctr.num_values;
-                       spn = TALLOC_ARRAY(mem_ctx, char *, num_spns);
+                       spn = talloc_array(mem_ctx, char *, num_spns);
                        for (count = 0; count < num_spns; count++) {
                                blob = attr->value_ctr.values[count].blob;
                                pull_string_talloc(spn, NULL, 0,
@@ -328,7 +297,7 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
                blob = attr->value_ctr.values[0].blob;
 
                switch (attr->attid) {
-                       case DRSUAPI_ATTRIBUTE_unicodePwd:
+                       case DRSUAPI_ATTID_unicodePwd:
 
                                if (blob->length != 16) {
                                        break;
@@ -349,27 +318,27 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
                                }
                                kvno = cur->meta_data_ctr->meta_data[i].version;
                                break;
-                       case DRSUAPI_ATTRIBUTE_ntPwdHistory:
+                       case DRSUAPI_ATTID_ntPwdHistory:
                                pwd_history_len = blob->length / 16;
                                pwd_history = blob->data;
                                break;
-                       case DRSUAPI_ATTRIBUTE_userPrincipalName:
+                       case DRSUAPI_ATTID_userPrincipalName:
                                pull_string_talloc(mem_ctx, NULL, 0, &upn,
                                                   blob->data, blob->length,
                                                   STR_UNICODE);
                                break;
-                       case DRSUAPI_ATTRIBUTE_sAMAccountName:
+                       case DRSUAPI_ATTID_sAMAccountName:
                                pull_string_talloc(mem_ctx, NULL, 0, &name,
                                                   blob->data, blob->length,
                                                   STR_UNICODE);
                                break;
-                       case DRSUAPI_ATTRIBUTE_sAMAccountType:
+                       case DRSUAPI_ATTID_sAMAccountType:
                                sam_type = IVAL(blob->data, 0);
                                break;
-                       case DRSUAPI_ATTRIBUTE_userAccountControl:
+                       case DRSUAPI_ATTID_userAccountControl:
                                uacc = IVAL(blob->data, 0);
                                break;
-                       case DRSUAPI_ATTRIBUTE_supplementalCredentials:
+                       case DRSUAPI_ATTID_supplementalCredentials:
                                status = parse_supplemental_credentials(mem_ctx,
                                                                        blob,
                                                                        &pkb3,
@@ -391,11 +360,11 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
        }
 
        if (name) {
-               status = add_to_keytab_entries(mem_ctx, ctx, 0, object_dn,
-                                              "SAMACCOUNTNAME",
-                                              ENCTYPE_NULL,
-                                              data_blob_talloc(mem_ctx, name,
-                                                       strlen(name) + 1));
+               status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, 0, object_dn,
+                                                            "SAMACCOUNTNAME",
+                                                            ENCTYPE_NULL,
+                                                            data_blob_talloc(mem_ctx, name,
+                                                            strlen(name) + 1));
                if (!NT_STATUS_IS_OK(status)) {
                        return status;
                }
@@ -454,9 +423,9 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
        }
        DEBUGADD(1,("\n"));
 
-       status = add_to_keytab_entries(mem_ctx, ctx, kvno, name, NULL,
-                                      ENCTYPE_ARCFOUR_HMAC,
-                                      data_blob_talloc(mem_ctx, nt_passwd, 16));
+       status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno, name, NULL,
+                                                    ENCTYPE_ARCFOUR_HMAC,
+                                                    data_blob_talloc(mem_ctx, nt_passwd, 16));
 
        if (!NT_STATUS_IS_OK(status)) {
                return status;
@@ -469,11 +438,11 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
                        if (!pkb4->keys[i].value) {
                                continue;
                        }
-                       status = add_to_keytab_entries(mem_ctx, ctx, kvno,
-                                                      name,
-                                                      NULL,
-                                                      pkb4->keys[i].keytype,
-                                                      *pkb4->keys[i].value);
+                       status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno,
+                                                                    name,
+                                                                    NULL,
+                                                                    pkb4->keys[i].keytype,
+                                                                    *pkb4->keys[i].value);
                        if (!NT_STATUS_IS_OK(status)) {
                                return status;
                        }
@@ -482,11 +451,11 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
                        if (!pkb4->old_keys[i].value) {
                                continue;
                        }
-                       status = add_to_keytab_entries(mem_ctx, ctx, kvno - 1,
-                                                      name,
-                                                      NULL,
-                                                      pkb4->old_keys[i].keytype,
-                                                      *pkb4->old_keys[i].value);
+                       status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno - 1,
+                                                                    name,
+                                                                    NULL,
+                                                                    pkb4->old_keys[i].keytype,
+                                                                    *pkb4->old_keys[i].value);
                        if (!NT_STATUS_IS_OK(status)) {
                                return status;
                        }
@@ -495,11 +464,11 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
                        if (!pkb4->older_keys[i].value) {
                                continue;
                        }
-                       status = add_to_keytab_entries(mem_ctx, ctx, kvno - 2,
-                                                      name,
-                                                      NULL,
-                                                      pkb4->older_keys[i].keytype,
-                                                      *pkb4->older_keys[i].value);
+                       status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno - 2,
+                                                                    name,
+                                                                    NULL,
+                                                                    pkb4->older_keys[i].keytype,
+                                                                    *pkb4->older_keys[i].value);
                        if (!NT_STATUS_IS_OK(status)) {
                                return status;
                        }
@@ -511,10 +480,10 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
                        if (!pkb3->keys[i].value) {
                                continue;
                        }
-                       status = add_to_keytab_entries(mem_ctx, ctx, kvno, name,
-                                                      NULL,
-                                                      pkb3->keys[i].keytype,
-                                                      *pkb3->keys[i].value);
+                       status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno, name,
+                                                                    NULL,
+                                                                    pkb3->keys[i].keytype,
+                                                                    *pkb3->keys[i].value);
                        if (!NT_STATUS_IS_OK(status)) {
                                return status;
                        }
@@ -523,11 +492,11 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
                        if (!pkb3->old_keys[i].value) {
                                continue;
                        }
-                       status = add_to_keytab_entries(mem_ctx, ctx, kvno - 1,
-                                                      name,
-                                                      NULL,
-                                                      pkb3->old_keys[i].keytype,
-                                                      *pkb3->old_keys[i].value);
+                       status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno - 1,
+                                                                    name,
+                                                                    NULL,
+                                                                    pkb3->old_keys[i].keytype,
+                                                                    *pkb3->old_keys[i].value);
                        if (!NT_STATUS_IS_OK(status)) {
                                return status;
                        }
@@ -549,9 +518,9 @@ static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
        }
 
        for (; i<pwd_history_len; i++) {
-               status = add_to_keytab_entries(mem_ctx, ctx, kvno--, name, NULL,
-                               ENCTYPE_ARCFOUR_HMAC,
-                               data_blob_talloc(mem_ctx, &pwd_history[i*16], 16));
+               status = libnet_keytab_add_to_keytab_entries(mem_ctx, ctx, kvno--, name, NULL,
+                                                            ENCTYPE_ARCFOUR_HMAC,
+                                                            data_blob_talloc(mem_ctx, &pwd_history[i*16], 16));
                if (!NT_STATUS_IS_OK(status)) {
                        break;
                }
@@ -632,7 +601,7 @@ static NTSTATUS keytab_process_objects(struct dssync_context *ctx,
 {
        return NT_STATUS_NOT_SUPPORTED;
 }
-#endif /* defined(HAVE_ADS) && defined(ENCTYPE_ARCFOUR_HMAC) */
+#endif /* defined(HAVE_ADS) */
 
 const struct dssync_ops libnet_dssync_keytab_ops = {
        .startup                = keytab_startup,