Add allow_badcharcnv argument to all conversion function, for
[vlendec/samba-autobuild/.git] / source4 / libnet / libnet_samdump.c
index ecedc0264ffb38b3bcbedbadd42a74ea3b49b64c..04a73c53fff53deaa4894a32e533c25326cd9fc7 100644 (file)
@@ -7,7 +7,7 @@
    
    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
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 
 #include "includes.h"
 #include "libnet/libnet.h"
-#include "librpc/gen_ndr/ndr_netlogon.h"
-#include "librpc/gen_ndr/ndr_samr.h"
-#include "dlinklist.h"
+#include "../lib/util/dlinklist.h"
+#include "samba3/samba3.h"
+#include "libcli/security/security.h"
 
 
 struct samdump_secret {
@@ -47,7 +46,6 @@ struct samdump_state {
 };
 
 static NTSTATUS vampire_samdump_handle_user(TALLOC_CTX *mem_ctx,
-                                           struct creds_CredentialState *creds,
                                            struct netr_DELTA_ENUM *delta) 
 {
        uint32_t rid = delta->delta_id_union.rid;
@@ -73,49 +71,46 @@ static NTSTATUS vampire_samdump_handle_user(TALLOC_CTX *mem_ctx,
 
 static NTSTATUS vampire_samdump_handle_secret(TALLOC_CTX *mem_ctx,
                                              struct samdump_state *samdump_state,
-                                             struct creds_CredentialState *creds,
                                              struct netr_DELTA_ENUM *delta) 
 {
        struct netr_DELTA_SECRET *secret = delta->delta_union.secret;
        const char *name = delta->delta_id_union.name;
-       struct samdump_secret *new = talloc(samdump_state, struct samdump_secret);
+       struct samdump_secret *n = talloc(samdump_state, struct samdump_secret);
 
-       new->name = talloc_steal(new, name);
-       new->secret = data_blob_talloc(new, secret->current_cipher.cipher_data, secret->current_cipher.maxlen);
-       new->mtime = secret->current_cipher_set_time;
+       n->name = talloc_strdup(n, name);
+       n->secret = data_blob_talloc(n, secret->current_cipher.cipher_data, secret->current_cipher.maxlen);
+       n->mtime = secret->current_cipher_set_time;
 
-       DLIST_ADD(samdump_state->secrets, new);
+       DLIST_ADD(samdump_state->secrets, n);
 
        return NT_STATUS_OK;
 }
 
 static NTSTATUS vampire_samdump_handle_trusted_domain(TALLOC_CTX *mem_ctx,
                                              struct samdump_state *samdump_state,
-                                             struct creds_CredentialState *creds,
                                              struct netr_DELTA_ENUM *delta) 
 {
        struct netr_DELTA_TRUSTED_DOMAIN *trusted_domain = delta->delta_union.trusted_domain;
        struct dom_sid *dom_sid = delta->delta_id_union.sid;
 
-       struct samdump_trusted_domain *new = talloc(samdump_state, struct samdump_trusted_domain);
+       struct samdump_trusted_domain *n = talloc(samdump_state, struct samdump_trusted_domain);
 
-       new->name = talloc_steal(new, trusted_domain->domain_name.string);
-       new->sid = talloc_steal(new, dom_sid);
+       n->name = talloc_strdup(n, trusted_domain->domain_name.string);
+       n->sid = talloc_steal(n, dom_sid);
 
-       DLIST_ADD(samdump_state->trusted_domains, new);
+       DLIST_ADD(samdump_state->trusted_domains, n);
 
        return NT_STATUS_OK;
 }
 
-static NTSTATUS libnet_samdump_fn(TALLOC_CTX *mem_ctx,                 
-                                 void *private,                        
-                                 struct creds_CredentialState *creds,
+static NTSTATUS libnet_samdump_fn(TALLOC_CTX *mem_ctx,
+                                 void *private_data,
                                  enum netr_SamDatabaseID database,
                                  struct netr_DELTA_ENUM *delta,
                                  char **error_string)
 {
        NTSTATUS nt_status = NT_STATUS_OK;
-       struct samdump_state *samdump_state = private;
+       struct samdump_state *samdump_state = (struct samdump_state *)private_data;
 
        *error_string = NULL;
        switch (delta->delta_type) {
@@ -124,16 +119,14 @@ static NTSTATUS libnet_samdump_fn(TALLOC_CTX *mem_ctx,
                /* not interested in builtin users */
                if (database == SAM_DATABASE_DOMAIN) {
                        nt_status = vampire_samdump_handle_user(mem_ctx, 
-                                                               creds,
                                                                delta);
-                       break;
                }
+               break;
        }
        case NETR_DELTA_SECRET:
        {
                nt_status = vampire_samdump_handle_secret(mem_ctx,
                                                          samdump_state,
-                                                         creds,
                                                          delta);
                break;
        }
@@ -141,7 +134,6 @@ static NTSTATUS libnet_samdump_fn(TALLOC_CTX *mem_ctx,
        {
                nt_status = vampire_samdump_handle_trusted_domain(mem_ctx,
                                                                  samdump_state,
-                                                                 creds,
                                                                  delta);
                break;
        }
@@ -152,7 +144,8 @@ static NTSTATUS libnet_samdump_fn(TALLOC_CTX *mem_ctx,
        return nt_status;
 }
 
-static NTSTATUS libnet_SamDump_netlogon(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, struct libnet_SamDump *r)
+NTSTATUS libnet_SamDump(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, 
+                       struct libnet_SamDump *r)
 {
        NTSTATUS nt_status;
        struct libnet_SamSync r2;
@@ -165,15 +158,19 @@ static NTSTATUS libnet_SamDump_netlogon(struct libnet_context *ctx, TALLOC_CTX *
                return NT_STATUS_NO_MEMORY;
        }
 
-       samdump_state->secrets = NULL;
+       samdump_state->secrets         = NULL;
        samdump_state->trusted_domains = NULL;
 
-       r2.error_string = NULL;
-       r2.delta_fn = libnet_samdump_fn;
-       r2.fn_ctx = samdump_state;
-       r2.machine_account = NULL; /* TODO:  Create a machine account, fill this in, and the delete it */
-       nt_status = libnet_SamSync_netlogon(ctx, samdump_state, &r2);
-       r->error_string = r2.error_string;
+       r2.out.error_string            = NULL;
+       r2.in.binding_string           = r->in.binding_string;
+       r2.in.rid_crypt                = lp_parm_bool(ctx->lp_ctx, NULL, "vampire", "rid decrypt", true);
+       r2.in.init_fn                  = NULL;
+       r2.in.delta_fn                 = libnet_samdump_fn;
+       r2.in.fn_ctx                   = samdump_state;
+       r2.in.machine_account          = r->in.machine_account;
+       nt_status                      = libnet_SamSync_netlogon(ctx, samdump_state, &r2);
+       r->out.error_string            = r2.out.error_string;
+       talloc_steal(mem_ctx, r->out.error_string);
 
        if (!NT_STATUS_IS_OK(nt_status)) {
                talloc_free(samdump_state);
@@ -184,49 +181,25 @@ static NTSTATUS libnet_SamDump_netlogon(struct libnet_context *ctx, TALLOC_CTX *
        for (t=samdump_state->trusted_domains; t; t=t->next) {
                char *secret_name = talloc_asprintf(mem_ctx, "G$$%s", t->name);
                for (s=samdump_state->secrets; s; s=s->next) {
-                       if (StrCaseCmp(s->name, secret_name) == 0) {
-                               char *secret_string;
-                               if (convert_string_talloc(mem_ctx, CH_UTF16, CH_UNIX, 
-                                                         s->secret.data, s->secret.length, 
-                                                         (void **)&secret_string) == -1) {
-                                       r->error_string = talloc_asprintf(mem_ctx, 
-                                                                         "Could not convert secret for domain %s to a string\n",
-                                                                         t->name);
-                                       talloc_free(samdump_state);
-                                       return NT_STATUS_INVALID_PARAMETER;
-                               }
-                               printf("%s\t%s\t%s\n", 
-                                      t->name, dom_sid_string(mem_ctx, t->sid), 
-                                      secret_string);
+                       char *secret_string;
+                       if (strcasecmp_m(s->name, secret_name) != 0) {
+                               continue;
+                       }
+                       if (convert_string_talloc_convenience(mem_ctx, lp_iconv_convenience(ctx->lp_ctx), CH_UTF16, CH_UNIX, 
+                                                 s->secret.data, s->secret.length, 
+                                                 (void **)&secret_string, false) == -1) {
+                               r->out.error_string = talloc_asprintf(mem_ctx, 
+                                                                     "Could not convert secret for domain %s to a string",
+                                                                     t->name);
+                               talloc_free(samdump_state);
+                               return NT_STATUS_INVALID_PARAMETER;
                        }
+                       printf("%s\t%s\t%s\n", 
+                              t->name, dom_sid_string(mem_ctx, t->sid), 
+                              secret_string);
                }
        }
        talloc_free(samdump_state);
        return nt_status;
 }
 
-
-
-static NTSTATUS libnet_SamDump_generic(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, struct libnet_SamDump *r)
-{
-       NTSTATUS nt_status;
-       struct libnet_SamDump r2;
-       r2.level = LIBNET_SAMDUMP_NETLOGON;
-       r2.error_string = NULL;
-       nt_status = libnet_SamDump(ctx, mem_ctx, &r2);
-       r->error_string = r2.error_string;
-       
-       return nt_status;
-}
-
-NTSTATUS libnet_SamDump(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, struct libnet_SamDump *r)
-{
-       switch (r->level) {
-       case LIBNET_SAMDUMP_GENERIC:
-               return libnet_SamDump_generic(ctx, mem_ctx, r);
-       case LIBNET_SAMDUMP_NETLOGON:
-               return libnet_SamDump_netlogon(ctx, mem_ctx, r);
-       }
-
-       return NT_STATUS_INVALID_LEVEL;
-}