root/source4/torture/rpc/rpc.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. torture_rpc_teardown
  2. torture_rpc_binding
  3. torture_rpc_connection
  4. torture_rpc_connection_transport
  5. torture_rpc_setup_machine
  6. torture_suite_add_machine_rpc_iface_tcase
  7. torture_suite_init_rpc_tcase
  8. torture_rpc_setup_anonymous
  9. torture_rpc_setup
  10. torture_suite_add_anon_rpc_iface_tcase
  11. torture_suite_add_rpc_iface_tcase
  12. torture_rpc_wrap_test
  13. torture_rpc_wrap_test_ex
  14. torture_rpc_wrap_test_creds
  15. torture_rpc_tcase_add_test
  16. torture_rpc_tcase_add_test_creds
  17. torture_rpc_tcase_add_test_ex
  18. torture_rpc_init

   1 /* 
   2    Unix SMB/CIFS implementation.
   3    SMB torture tester
   4    Copyright (C) Andrew Tridgell 1997-2003
   5    Copyright (C) Jelmer Vernooij 2006
   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 "auth/credentials/credentials.h"
  23 #include "lib/cmdline/popt_common.h"
  24 #include "librpc/rpc/dcerpc.h"
  25 #include "torture/rpc/rpc.h"
  26 #include "torture/smbtorture.h"
  27 #include "librpc/ndr/ndr_table.h"
  28 #include "../lib/util/dlinklist.h"
  29 
  30 static bool torture_rpc_teardown (struct torture_context *tcase, 
     /* [<][>][^][v][top][bottom][index][help] */
  31                                           void *data)
  32 {
  33         struct torture_rpc_tcase_data *tcase_data = 
  34                 (struct torture_rpc_tcase_data *)data;
  35         if (tcase_data->join_ctx != NULL)
  36             torture_leave_domain(tcase, tcase_data->join_ctx);
  37         talloc_free(tcase_data);
  38         return true;
  39 }
  40 
  41 /**
  42  * Obtain the DCE/RPC binding context associated with a torture context.
  43  *
  44  * @param tctx Torture context
  45  * @param binding Pointer to store DCE/RPC binding
  46  */
  47 NTSTATUS torture_rpc_binding(struct torture_context *tctx,
     /* [<][>][^][v][top][bottom][index][help] */
  48                              struct dcerpc_binding **binding)
  49 {
  50         NTSTATUS status;
  51         const char *binding_string = torture_setting_string(tctx, "binding", 
  52                                                             NULL);
  53 
  54         if (binding_string == NULL) {
  55                 torture_comment(tctx, 
  56                                 "You must specify a DCE/RPC binding string\n");
  57                 return NT_STATUS_INVALID_PARAMETER;
  58         }
  59 
  60         status = dcerpc_parse_binding(tctx, binding_string, binding);
  61         if (NT_STATUS_IS_ERR(status)) {
  62                 DEBUG(0,("Failed to parse dcerpc binding '%s'\n", 
  63                          binding_string));
  64                 return status;
  65         }
  66 
  67         return NT_STATUS_OK;    
  68 }
  69 
  70 /**
  71  * open a rpc connection to the chosen binding string
  72  */
  73 _PUBLIC_ NTSTATUS torture_rpc_connection(struct torture_context *tctx,
     /* [<][>][^][v][top][bottom][index][help] */
  74                                 struct dcerpc_pipe **p, 
  75                                 const struct ndr_interface_table *table)
  76 {
  77         NTSTATUS status;
  78         struct dcerpc_binding *binding;
  79 
  80         dcerpc_init(tctx->lp_ctx);
  81 
  82         status = torture_rpc_binding(tctx, &binding);
  83         if (NT_STATUS_IS_ERR(status))
  84                 return status;
  85 
  86         status = dcerpc_pipe_connect_b(tctx, 
  87                                      p, binding, table,
  88                                      cmdline_credentials, tctx->ev, tctx->lp_ctx);
  89  
  90         if (NT_STATUS_IS_ERR(status)) {
  91                 printf("Failed to connect to remote server: %s %s\n", 
  92                            dcerpc_binding_string(tctx, binding), nt_errstr(status));
  93         }
  94 
  95         return status;
  96 }
  97 
  98 /**
  99  * open a rpc connection to a specific transport
 100  */
 101 NTSTATUS torture_rpc_connection_transport(struct torture_context *tctx, 
     /* [<][>][^][v][top][bottom][index][help] */
 102                                           struct dcerpc_pipe **p, 
 103                                           const struct ndr_interface_table *table,
 104                                           enum dcerpc_transport_t transport,
 105                                           uint32_t assoc_group_id)
 106 {
 107         NTSTATUS status;
 108         struct dcerpc_binding *binding;
 109 
 110         status = torture_rpc_binding(tctx, &binding);
 111         if (NT_STATUS_IS_ERR(status))
 112                 return status;
 113 
 114         binding->transport = transport;
 115         binding->assoc_group_id = assoc_group_id;
 116 
 117         status = dcerpc_pipe_connect_b(tctx, p, binding, table,
 118                                        cmdline_credentials, tctx->ev, tctx->lp_ctx);
 119                                            
 120         if (NT_STATUS_IS_ERR(status)) {
 121                 *p = NULL;
 122         }
 123 
 124         return status;
 125 }
 126 
 127 static bool torture_rpc_setup_machine(struct torture_context *tctx,
     /* [<][>][^][v][top][bottom][index][help] */
 128                                       void **data)
 129 {
 130         NTSTATUS status;
 131         struct dcerpc_binding *binding;
 132         struct torture_rpc_tcase *tcase = talloc_get_type(tctx->active_tcase, 
 133                                                 struct torture_rpc_tcase);
 134         struct torture_rpc_tcase_data *tcase_data;
 135 
 136         status = torture_rpc_binding(tctx, &binding);
 137         if (NT_STATUS_IS_ERR(status))
 138                 return false;
 139 
 140         *data = tcase_data = talloc_zero(tctx, struct torture_rpc_tcase_data);
 141         tcase_data->credentials = cmdline_credentials;
 142         tcase_data->join_ctx = torture_join_domain(tctx, tcase->machine_name,
 143                                                    ACB_SVRTRUST, 
 144                                                    &tcase_data->credentials);
 145         if (tcase_data->join_ctx == NULL)
 146             torture_fail(tctx, "Failed to join as BDC");
 147 
 148         status = dcerpc_pipe_connect_b(tctx, 
 149                                 &(tcase_data->pipe),
 150                                 binding,
 151                                 tcase->table,
 152                                 tcase_data->credentials, tctx->ev, tctx->lp_ctx);
 153 
 154         torture_assert_ntstatus_ok(tctx, status, "Error connecting to server");
 155 
 156         return true;
 157 }
 158 
 159 _PUBLIC_ struct torture_rpc_tcase *torture_suite_add_machine_rpc_iface_tcase(
     /* [<][>][^][v][top][bottom][index][help] */
 160                                 struct torture_suite *suite, 
 161                                 const char *name,
 162                                 const struct ndr_interface_table *table,
 163                                 const char *machine_name)
 164 {
 165         struct torture_rpc_tcase *tcase = talloc(suite, 
 166                                                  struct torture_rpc_tcase);
 167 
 168         torture_suite_init_rpc_tcase(suite, tcase, name, table);
 169 
 170         tcase->machine_name = talloc_strdup(tcase, machine_name);
 171         tcase->tcase.setup = torture_rpc_setup_machine;
 172         tcase->tcase.teardown = torture_rpc_teardown;
 173 
 174         return tcase;
 175 }
 176 
 177 _PUBLIC_ bool torture_suite_init_rpc_tcase(struct torture_suite *suite, 
     /* [<][>][^][v][top][bottom][index][help] */
 178                                            struct torture_rpc_tcase *tcase, 
 179                                            const char *name,
 180                                            const struct ndr_interface_table *table)
 181 {
 182         if (!torture_suite_init_tcase(suite, (struct torture_tcase *)tcase, name))
 183                 return false;
 184 
 185         tcase->table = table;
 186 
 187         return true;
 188 }
 189 
 190 static bool torture_rpc_setup_anonymous(struct torture_context *tctx, 
     /* [<][>][^][v][top][bottom][index][help] */
 191                                         void **data)
 192 {
 193         NTSTATUS status;
 194         struct dcerpc_binding *binding;
 195         struct torture_rpc_tcase_data *tcase_data;
 196         struct torture_rpc_tcase *tcase = talloc_get_type(tctx->active_tcase, 
 197                                                           struct torture_rpc_tcase);
 198 
 199         status = torture_rpc_binding(tctx, &binding);
 200         if (NT_STATUS_IS_ERR(status))
 201                 return false;
 202 
 203         *data = tcase_data = talloc_zero(tctx, struct torture_rpc_tcase_data);
 204         tcase_data->credentials = cli_credentials_init_anon(tctx);
 205 
 206         status = dcerpc_pipe_connect_b(tctx, 
 207                                 &(tcase_data->pipe),
 208                                 binding,
 209                                 tcase->table,
 210                                 tcase_data->credentials, tctx->ev, tctx->lp_ctx);
 211 
 212         torture_assert_ntstatus_ok(tctx, status, "Error connecting to server");
 213 
 214         return true;
 215 }
 216 
 217 static bool torture_rpc_setup (struct torture_context *tctx, void **data)
     /* [<][>][^][v][top][bottom][index][help] */
 218 {
 219         NTSTATUS status;
 220         struct torture_rpc_tcase *tcase = talloc_get_type(
 221                                                 tctx->active_tcase, struct torture_rpc_tcase);
 222         struct torture_rpc_tcase_data *tcase_data;
 223 
 224         *data = tcase_data = talloc_zero(tctx, struct torture_rpc_tcase_data);
 225         tcase_data->credentials = cmdline_credentials;
 226         
 227         status = torture_rpc_connection(tctx, 
 228                                 &(tcase_data->pipe),
 229                                 tcase->table);
 230 
 231         torture_assert_ntstatus_ok(tctx, status, "Error connecting to server");
 232 
 233         return true;
 234 }
 235 
 236 
 237 
 238 _PUBLIC_ struct torture_rpc_tcase *torture_suite_add_anon_rpc_iface_tcase(struct torture_suite *suite, 
     /* [<][>][^][v][top][bottom][index][help] */
 239                                                                 const char *name,
 240                                                                 const struct ndr_interface_table *table)
 241 {
 242         struct torture_rpc_tcase *tcase = talloc(suite, struct torture_rpc_tcase);
 243 
 244         torture_suite_init_rpc_tcase(suite, tcase, name, table);
 245 
 246         tcase->tcase.setup = torture_rpc_setup_anonymous;
 247         tcase->tcase.teardown = torture_rpc_teardown;
 248 
 249         return tcase;
 250 }
 251 
 252 
 253 _PUBLIC_ struct torture_rpc_tcase *torture_suite_add_rpc_iface_tcase(struct torture_suite *suite, 
     /* [<][>][^][v][top][bottom][index][help] */
 254                                                                 const char *name,
 255                                                                 const struct ndr_interface_table *table)
 256 {
 257         struct torture_rpc_tcase *tcase = talloc(suite, struct torture_rpc_tcase);
 258 
 259         torture_suite_init_rpc_tcase(suite, tcase, name, table);
 260 
 261         tcase->tcase.setup = torture_rpc_setup;
 262         tcase->tcase.teardown = torture_rpc_teardown;
 263 
 264         return tcase;
 265 }
 266 
 267 static bool torture_rpc_wrap_test(struct torture_context *tctx, 
     /* [<][>][^][v][top][bottom][index][help] */
 268                                                                   struct torture_tcase *tcase,
 269                                                                   struct torture_test *test)
 270 {
 271         bool (*fn) (struct torture_context *, struct dcerpc_pipe *);
 272         struct torture_rpc_tcase_data *tcase_data = 
 273                 (struct torture_rpc_tcase_data *)tcase->data;
 274 
 275         fn = test->fn;
 276 
 277         return fn(tctx, tcase_data->pipe);
 278 }
 279 
 280 static bool torture_rpc_wrap_test_ex(struct torture_context *tctx, 
     /* [<][>][^][v][top][bottom][index][help] */
 281                                                                   struct torture_tcase *tcase,
 282                                                                   struct torture_test *test)
 283 {
 284         bool (*fn) (struct torture_context *, struct dcerpc_pipe *, const void *);
 285         struct torture_rpc_tcase_data *tcase_data = 
 286                 (struct torture_rpc_tcase_data *)tcase->data;
 287 
 288         fn = test->fn;
 289 
 290         return fn(tctx, tcase_data->pipe, test->data);
 291 }
 292 
 293 
 294 static bool torture_rpc_wrap_test_creds(struct torture_context *tctx, 
     /* [<][>][^][v][top][bottom][index][help] */
 295                                                                   struct torture_tcase *tcase,
 296                                                                   struct torture_test *test)
 297 {
 298         bool (*fn) (struct torture_context *, struct dcerpc_pipe *, struct cli_credentials *);
 299         struct torture_rpc_tcase_data *tcase_data = 
 300                 (struct torture_rpc_tcase_data *)tcase->data;
 301 
 302         fn = test->fn;
 303 
 304         return fn(tctx, tcase_data->pipe, tcase_data->credentials);
 305 }
 306 
 307 _PUBLIC_ struct torture_test *torture_rpc_tcase_add_test(
     /* [<][>][^][v][top][bottom][index][help] */
 308                                         struct torture_rpc_tcase *tcase, 
 309                                         const char *name, 
 310                                         bool (*fn) (struct torture_context *, struct dcerpc_pipe *))
 311 {
 312         struct torture_test *test;
 313 
 314         test = talloc(tcase, struct torture_test);
 315 
 316         test->name = talloc_strdup(test, name);
 317         test->description = NULL;
 318         test->run = torture_rpc_wrap_test;
 319         test->dangerous = false;
 320         test->data = NULL;
 321         test->fn = fn;
 322 
 323         DLIST_ADD(tcase->tcase.tests, test);
 324 
 325         return test;
 326 }
 327 
 328 _PUBLIC_ struct torture_test *torture_rpc_tcase_add_test_creds(
     /* [<][>][^][v][top][bottom][index][help] */
 329                                         struct torture_rpc_tcase *tcase, 
 330                                         const char *name, 
 331                                         bool (*fn) (struct torture_context *, struct dcerpc_pipe *, struct cli_credentials *))
 332 {
 333         struct torture_test *test;
 334 
 335         test = talloc(tcase, struct torture_test);
 336 
 337         test->name = talloc_strdup(test, name);
 338         test->description = NULL;
 339         test->run = torture_rpc_wrap_test_creds;
 340         test->dangerous = false;
 341         test->data = NULL;
 342         test->fn = fn;
 343 
 344         DLIST_ADD(tcase->tcase.tests, test);
 345 
 346         return test;
 347 }
 348 
 349 _PUBLIC_ struct torture_test *torture_rpc_tcase_add_test_ex(
     /* [<][>][^][v][top][bottom][index][help] */
 350                                         struct torture_rpc_tcase *tcase, 
 351                                         const char *name, 
 352                                         bool (*fn) (struct torture_context *, struct dcerpc_pipe *,
 353                                                                 void *),
 354                                         void *userdata)
 355 {
 356         struct torture_test *test;
 357 
 358         test = talloc(tcase, struct torture_test);
 359 
 360         test->name = talloc_strdup(test, name);
 361         test->description = NULL;
 362         test->run = torture_rpc_wrap_test_ex;
 363         test->dangerous = false;
 364         test->data = userdata;
 365         test->fn = fn;
 366 
 367         DLIST_ADD(tcase->tcase.tests, test);
 368 
 369         return test;
 370 }
 371 
 372 NTSTATUS torture_rpc_init(void)
     /* [<][>][^][v][top][bottom][index][help] */
 373 {
 374         struct torture_suite *suite = torture_suite_create(talloc_autofree_context(), "RPC");
 375 
 376         ndr_table_init();
 377 
 378         torture_suite_add_simple_test(suite, "LSA", torture_rpc_lsa);
 379         torture_suite_add_simple_test(suite, "LSALOOKUP", torture_rpc_lsa_lookup);
 380         torture_suite_add_simple_test(suite, "LSA-GETUSER", torture_rpc_lsa_get_user);
 381         torture_suite_add_suite(suite, torture_rpc_lsa_lookup_sids(suite));
 382         torture_suite_add_suite(suite, torture_rpc_lsa_lookup_names(suite));
 383         torture_suite_add_suite(suite, torture_rpc_lsa_secrets(suite));
 384         torture_suite_add_suite(suite, torture_rpc_echo(suite));
 385         torture_suite_add_simple_test(suite, "DFS", torture_rpc_dfs);
 386         torture_suite_add_suite(suite, torture_rpc_frsapi(suite));
 387         torture_suite_add_suite(suite, torture_rpc_unixinfo(suite));
 388         torture_suite_add_suite(suite, torture_rpc_eventlog(suite));
 389         torture_suite_add_suite(suite, torture_rpc_atsvc(suite));
 390         torture_suite_add_suite(suite, torture_rpc_wkssvc(suite));
 391         torture_suite_add_suite(suite, torture_rpc_handles(suite));
 392         torture_suite_add_suite(suite, torture_rpc_object_uuid(suite));
 393         torture_suite_add_suite(suite, torture_rpc_winreg(suite));
 394         torture_suite_add_simple_test(suite, "SPOOLSS", torture_rpc_spoolss);
 395         torture_suite_add_suite(suite, torture_rpc_spoolss_notify(suite));
 396         torture_suite_add_suite(suite, torture_rpc_spoolss_win(suite));
 397         torture_suite_add_simple_test(suite, "SAMR", torture_rpc_samr);
 398         torture_suite_add_simple_test(suite, "SAMR-USERS", torture_rpc_samr_users);
 399         torture_suite_add_simple_test(suite, "SAMR-PASSWORDS", torture_rpc_samr_passwords);
 400         torture_suite_add_suite(suite, torture_rpc_netlogon(suite));
 401         torture_suite_add_suite(suite, torture_rpc_remote_pac(suite));
 402         torture_suite_add_simple_test(suite, "SAMLOGON", torture_rpc_samlogon);
 403         torture_suite_add_simple_test(suite, "SAMSYNC", torture_rpc_samsync);
 404         torture_suite_add_simple_test(suite, "SCHANNEL", torture_rpc_schannel);
 405         torture_suite_add_simple_test(suite, "SCHANNEL2", torture_rpc_schannel2);
 406         torture_suite_add_simple_test(suite, "BENCH-SCHANNEL1", torture_rpc_schannel_bench1);
 407         torture_suite_add_suite(suite, torture_rpc_srvsvc(suite));
 408         torture_suite_add_suite(suite, torture_rpc_svcctl(suite));
 409         torture_suite_add_suite(suite, torture_rpc_samr_accessmask(suite));
 410         torture_suite_add_suite(suite, torture_rpc_samr_passwords_pwdlastset(suite));
 411         torture_suite_add_suite(suite, torture_rpc_samr_user_privileges(suite));
 412         torture_suite_add_suite(suite, torture_rpc_samr_large_dc(suite));
 413         torture_suite_add_suite(suite, torture_rpc_epmapper(suite));
 414         torture_suite_add_suite(suite, torture_rpc_initshutdown(suite));
 415         torture_suite_add_suite(suite, torture_rpc_oxidresolve(suite));
 416         torture_suite_add_suite(suite, torture_rpc_remact(suite));
 417         torture_suite_add_simple_test(suite, "MGMT", torture_rpc_mgmt);
 418         torture_suite_add_simple_test(suite, "SCANNER", torture_rpc_scanner);
 419         torture_suite_add_simple_test(suite, "AUTOIDL", torture_rpc_autoidl);
 420         torture_suite_add_simple_test(suite, "COUNTCALLS", torture_rpc_countcalls);
 421         torture_suite_add_simple_test(suite, "MULTIBIND", torture_multi_bind);
 422         torture_suite_add_simple_test(suite, "AUTHCONTEXT", torture_bind_authcontext);
 423         torture_suite_add_simple_test(suite, "BINDSAMBA3", torture_bind_samba3);
 424         torture_suite_add_simple_test(suite, "NETLOGSAMBA3", torture_netlogon_samba3);
 425         torture_suite_add_simple_test(suite, "SAMBA3SESSIONKEY", torture_samba3_sessionkey);
 426         torture_suite_add_simple_test(suite, "SAMBA3-SRVSVC", torture_samba3_rpc_srvsvc);
 427         torture_suite_add_simple_test(suite, "SAMBA3-SHARESEC",
 428                             torture_samba3_rpc_sharesec);
 429         torture_suite_add_simple_test(suite, "SAMBA3-GETUSERNAME",
 430                             torture_samba3_rpc_getusername);
 431         torture_suite_add_simple_test(suite, "SAMBA3-RANDOMAUTH2",
 432                                       torture_samba3_rpc_randomauth2);
 433         torture_suite_add_simple_test(suite, "SAMBA3-LSA", torture_samba3_rpc_lsa);
 434         torture_suite_add_simple_test(suite, "SAMBA3-SPOOLSS", torture_samba3_rpc_spoolss);
 435         torture_suite_add_simple_test(suite, "SAMBA3-WKSSVC", torture_samba3_rpc_wkssvc);
 436         torture_suite_add_simple_test(suite, "SAMBA3-WINREG", torture_samba3_rpc_winreg);
 437         torture_suite_add_simple_test(suite, "DRSUAPI", torture_rpc_drsuapi);
 438         torture_suite_add_simple_test(suite, "CRACKNAMES", torture_rpc_drsuapi_cracknames);
 439         torture_suite_add_suite(suite, torture_rpc_dssetup(suite));
 440         torture_suite_add_suite(suite, torture_rpc_browser(suite));
 441         torture_suite_add_simple_test(suite, "SAMBA3-REGCONFIG", torture_samba3_regconfig);
 442         torture_suite_add_simple_test(suite, "ALTERCONTEXT", torture_rpc_alter_context);
 443         torture_suite_add_simple_test(suite, "JOIN", torture_rpc_join);
 444         torture_suite_add_simple_test(suite, "DSSYNC", torture_rpc_dssync);
 445         torture_suite_add_simple_test(suite, "BENCH-RPC", torture_bench_rpc);
 446         torture_suite_add_simple_test(suite, "ASYNCBIND", torture_async_bind);
 447         torture_suite_add_suite(suite, torture_rpc_ntsvcs(suite));
 448 
 449         suite->description = talloc_strdup(suite, "DCE/RPC protocol and interface tests");
 450 
 451         torture_register_suite(suite);
 452 
 453         return NT_STATUS_OK;
 454 }

/* [<][>][^][v][top][bottom][index][help] */