1/* 2 Unix SMB/CIFS implementation. 3 Test suite for libnet calls. 4 5 Copyright (C) Rafal Szczesniak 2005 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. 19*/ 20 21#include "includes.h" 22#include "lib/cmdline/popt_common.h" 23#include "libnet/libnet.h" 24#include "librpc/gen_ndr/nbt.h" 25#include "librpc/rpc/dcerpc.h" 26#include "libcli/libcli.h" 27#include "torture/rpc/rpc.h" 28#include "torture/torture.h" 29#include "param/param.h" 30 31 32bool torture_lookup(struct torture_context *torture) 33{ 34 bool ret; 35 NTSTATUS status; 36 TALLOC_CTX *mem_ctx; 37 struct libnet_context *ctx; 38 struct libnet_Lookup lookup; 39 struct dcerpc_binding *binding; 40 41 mem_ctx = talloc_init("test_lookup"); 42 43 ctx = libnet_context_init(torture->ev, torture->lp_ctx); 44 ctx->cred = cmdline_credentials; 45 46 lookup.in.hostname = torture_setting_string(torture, "host", NULL); 47 if (lookup.in.hostname == NULL) { 48 status = torture_rpc_binding(torture, &binding); 49 if (NT_STATUS_IS_OK(status)) { 50 lookup.in.hostname = binding->host; 51 } 52 } 53 54 lookup.in.type = NBT_NAME_CLIENT; 55 lookup.in.resolve_ctx = NULL; 56 lookup.out.address = NULL; 57 58 status = libnet_Lookup(ctx, mem_ctx, &lookup); 59 60 if (!NT_STATUS_IS_OK(status)) { 61 printf("Couldn't lookup name %s: %s\n", lookup.in.hostname, nt_errstr(status)); 62 ret = false; 63 goto done; 64 } 65 66 ret = true; 67 68 printf("Name [%s] found at address: %s.\n", lookup.in.hostname, *lookup.out.address); 69 70done: 71 talloc_free(mem_ctx); 72 return ret; 73} 74 75 76bool torture_lookup_host(struct torture_context *torture) 77{ 78 bool ret; 79 NTSTATUS status; 80 TALLOC_CTX *mem_ctx; 81 struct libnet_context *ctx; 82 struct libnet_Lookup lookup; 83 struct dcerpc_binding *binding; 84 85 mem_ctx = talloc_init("test_lookup_host"); 86 87 ctx = libnet_context_init(torture->ev, torture->lp_ctx); 88 ctx->cred = cmdline_credentials; 89 90 lookup.in.hostname = torture_setting_string(torture, "host", NULL); 91 if (lookup.in.hostname == NULL) { 92 status = torture_rpc_binding(torture, &binding); 93 if (NT_STATUS_IS_OK(status)) { 94 lookup.in.hostname = binding->host; 95 } 96 } 97 98 lookup.in.resolve_ctx = NULL; 99 lookup.out.address = NULL; 100 101 status = libnet_LookupHost(ctx, mem_ctx, &lookup); 102 103 if (!NT_STATUS_IS_OK(status)) { 104 printf("Couldn't lookup host %s: %s\n", lookup.in.hostname, nt_errstr(status)); 105 ret = false; 106 goto done; 107 } 108 109 ret = true; 110 111 printf("Host [%s] found at address: %s.\n", lookup.in.hostname, *lookup.out.address); 112 113done: 114 talloc_free(mem_ctx); 115 return ret; 116} 117 118 119bool torture_lookup_pdc(struct torture_context *torture) 120{ 121 bool ret; 122 NTSTATUS status; 123 TALLOC_CTX *mem_ctx; 124 struct libnet_context *ctx; 125 struct libnet_LookupDCs *lookup; 126 int i; 127 128 mem_ctx = talloc_init("test_lookup_pdc"); 129 130 ctx = libnet_context_init(torture->ev, torture->lp_ctx); 131 ctx->cred = cmdline_credentials; 132 133 talloc_steal(ctx, mem_ctx); 134 135 lookup = talloc(mem_ctx, struct libnet_LookupDCs); 136 if (!lookup) { 137 ret = false; 138 goto done; 139 } 140 141 lookup->in.domain_name = lp_workgroup(torture->lp_ctx); 142 lookup->in.name_type = NBT_NAME_PDC; 143 144 status = libnet_LookupDCs(ctx, mem_ctx, lookup); 145 146 if (!NT_STATUS_IS_OK(status)) { 147 printf("Couldn't lookup pdc %s: %s\n", lookup->in.domain_name, 148 nt_errstr(status)); 149 ret = false; 150 goto done; 151 } 152 153 ret = true; 154 155 printf("DCs of domain [%s] found.\n", lookup->in.domain_name); 156 for (i = 0; i < lookup->out.num_dcs; i++) { 157 printf("\tDC[%d]: name=%s, address=%s\n", i, lookup->out.dcs[i].name, 158 lookup->out.dcs[i].address); 159 } 160 161done: 162 talloc_free(mem_ctx); 163 return ret; 164} 165 166 167bool torture_lookup_sam_name(struct torture_context *torture) 168{ 169 NTSTATUS status; 170 TALLOC_CTX *mem_ctx; 171 struct libnet_context *ctx; 172 struct libnet_LookupName r; 173 174 ctx = libnet_context_init(torture->ev, torture->lp_ctx); 175 ctx->cred = cmdline_credentials; 176 177 mem_ctx = talloc_init("torture lookup sam name"); 178 if (mem_ctx == NULL) return false; 179 180 r.in.name = "Administrator"; 181 r.in.domain_name = lp_workgroup(torture->lp_ctx); 182 183 status = libnet_LookupName(ctx, mem_ctx, &r); 184 185 talloc_free(mem_ctx); 186 talloc_free(ctx); 187 188 return true; 189} 190