s3-libnet: better separate headers.
[kamenim/samba.git] / source3 / libnet / libnet_dssync_keytab.c
index 51156cbdba216c9f0f28efb098ad0ba8dadd18a6..b0c745d1107ade72e80c866a9d95d2feefe49f87 100644 (file)
@@ -2,6 +2,7 @@
    Unix SMB/CIFS implementation.
 
    Copyright (C) Guenther Deschner <gd@samba.org> 2008
+   Copyright (C) Michael Adam 2008
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 */
 
 #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)
 
-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;
-}
-
 static NTSTATUS keytab_startup(struct dssync_context *ctx, TALLOC_CTX *mem_ctx,
                               struct replUpToDateVectorBlob **pold_utdv)
 {
@@ -80,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;
@@ -123,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;
                }
@@ -141,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);
@@ -386,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;
                }
@@ -449,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;
@@ -464,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;
                        }
@@ -477,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;
                        }
@@ -490,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;
                        }
@@ -506,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;
                        }
@@ -518,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;
                        }
@@ -544,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;
                }