root/source4/torture/rpc/frsapi.c

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

DEFINITIONS

This source file includes following definitions.
  1. test_GetDsPollingIntervalW
  2. test_SetDsPollingIntervalW
  3. test_DsPollingIntervalW
  4. test_IsPathReplicated_err
  5. _test_IsPathReplicated
  6. test_IsPathReplicated
  7. test_ForceReplication
  8. test_InfoW
  9. torture_rpc_frsapi

   1 /*
   2    Unix SMB/CIFS implementation.
   3    test suite for rpc frsapi operations
   4 
   5    Copyright (C) Guenther Deschner 2007
   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, write to the Free Software
  19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20 */
  21 
  22 #include "includes.h"
  23 #include "torture/torture.h"
  24 #include "torture/rpc/rpc.h"
  25 #include "librpc/gen_ndr/ndr_frsapi_c.h"
  26 #include "torture/util.h"
  27 #include "param/param.h"
  28 
  29 static bool test_GetDsPollingIntervalW(struct torture_context *tctx,
     /* [<][>][^][v][top][bottom][index][help] */
  30                                        struct dcerpc_pipe *p,
  31                                        uint32_t *CurrentInterval,
  32                                        uint32_t *DsPollingLongInterval,
  33                                        uint32_t *DsPollingShortInterval)
  34 {
  35         struct frsapi_GetDsPollingIntervalW r;
  36 
  37         ZERO_STRUCT(r);
  38 
  39         r.out.CurrentInterval = CurrentInterval;
  40         r.out.DsPollingLongInterval = DsPollingLongInterval;
  41         r.out.DsPollingShortInterval = DsPollingShortInterval;
  42 
  43         torture_assert_ntstatus_ok(tctx,
  44                 dcerpc_frsapi_GetDsPollingIntervalW(p, tctx, &r),
  45                 "GetDsPollingIntervalW failed");
  46 
  47         torture_assert_werr_ok(tctx, r.out.result,
  48                                "GetDsPollingIntervalW failed");
  49 
  50         return true;
  51 }
  52 
  53 static bool test_SetDsPollingIntervalW(struct torture_context *tctx,
     /* [<][>][^][v][top][bottom][index][help] */
  54                                        struct dcerpc_pipe *p,
  55                                        uint32_t CurrentInterval,
  56                                        uint32_t DsPollingLongInterval,
  57                                        uint32_t DsPollingShortInterval)
  58 {
  59         struct frsapi_SetDsPollingIntervalW r;
  60 
  61         ZERO_STRUCT(r);
  62 
  63         r.in.CurrentInterval = CurrentInterval;
  64         r.in.DsPollingLongInterval = DsPollingLongInterval;
  65         r.in.DsPollingShortInterval = DsPollingShortInterval;
  66 
  67         torture_assert_ntstatus_ok(tctx,
  68                 dcerpc_frsapi_SetDsPollingIntervalW(p, tctx, &r),
  69                 "SetDsPollingIntervalW failed");
  70 
  71         torture_assert_werr_ok(tctx, r.out.result,
  72                                "SetDsPollingIntervalW failed");
  73 
  74         return true;
  75 }
  76 
  77 static bool test_DsPollingIntervalW(struct torture_context *tctx,
     /* [<][>][^][v][top][bottom][index][help] */
  78                                     struct dcerpc_pipe *p)
  79 {
  80         uint32_t i1, i2, i3;
  81         uint32_t k1, k2, k3;
  82 
  83         if (!test_GetDsPollingIntervalW(tctx, p, &i1, &i2, &i3)) {
  84                 return false;
  85         }
  86 
  87         if (!test_SetDsPollingIntervalW(tctx, p, i1, i2, i3)) {
  88                 return false;
  89         }
  90 
  91         k1 = i1;
  92         k2 = k3 = 0;
  93 
  94         if (!test_SetDsPollingIntervalW(tctx, p, k1, k2, k3)) {
  95                 return false;
  96         }
  97 
  98         if (!test_GetDsPollingIntervalW(tctx, p, &k1, &k2, &k3)) {
  99                 return false;
 100         }
 101 
 102         if ((i1 != k1) || (i2 != k2) || (i3 != k3)) {
 103                 return false;
 104         }
 105 
 106         return true;
 107 }
 108 
 109 static bool test_IsPathReplicated_err(struct torture_context *tctx,
     /* [<][>][^][v][top][bottom][index][help] */
 110                                       struct dcerpc_pipe *p,
 111                                       const char *path,
 112                                       uint32_t type,
 113                                       WERROR werr)
 114 {
 115         struct frsapi_IsPathReplicated r;
 116         struct GUID guid;
 117         uint32_t unknown1, unknown2, unknown3 = 0;
 118 
 119         ZERO_STRUCT(r);
 120 
 121         r.in.path = path;
 122         r.in.replica_set_type = type;
 123         r.out.unknown1 = &unknown1;
 124         r.out.unknown2 = &unknown2;
 125         r.out.unknown3 = &unknown3;
 126         r.out.replica_set_guid = &guid;
 127 
 128         torture_assert_ntstatus_ok(tctx,
 129                 dcerpc_frsapi_IsPathReplicated(p, tctx, &r),
 130                 "IsPathReplicated failed");
 131 
 132         torture_assert_werr_equal(tctx, r.out.result, werr,
 133                                   "GetDsPollingIntervalW failed");
 134 
 135         return true;
 136 }
 137 
 138 static bool _test_IsPathReplicated(struct torture_context *tctx,
     /* [<][>][^][v][top][bottom][index][help] */
 139                                   struct dcerpc_pipe *p,
 140                                   const char *path,
 141                                   uint32_t type)
 142 {
 143         return test_IsPathReplicated_err(tctx, p, path, type, WERR_OK);
 144 }
 145 
 146 static bool test_IsPathReplicated(struct torture_context *tctx,
     /* [<][>][^][v][top][bottom][index][help] */
 147                                   struct dcerpc_pipe *p)
 148 {
 149         const uint32_t lvls[] = {
 150                 FRSAPI_REPLICA_SET_TYPE_0,
 151                 FRSAPI_REPLICA_SET_TYPE_DOMAIN,
 152                 FRSAPI_REPLICA_SET_TYPE_DFS };
 153         int i;
 154         bool ret = true;
 155 
 156         if (!test_IsPathReplicated_err(tctx, p, NULL, 0,
 157                                        WERR_FRS_INVALID_SERVICE_PARAMETER)) {
 158                 ret = false;
 159         }
 160 
 161         for (i=0; i<ARRAY_SIZE(lvls); i++) {
 162                 if (!_test_IsPathReplicated(tctx, p, dcerpc_server_name(p),
 163                                             lvls[i])) {
 164                         ret = false;
 165                 }
 166         }
 167 
 168         for (i=0; i<ARRAY_SIZE(lvls); i++) {
 169                 const char *path = talloc_asprintf(tctx, "\\\\%s\\SYSVOL",
 170                                                    dcerpc_server_name(p));
 171                 if (!_test_IsPathReplicated(tctx, p, path, lvls[i])) {
 172                         ret = false;
 173                 }
 174         }
 175 
 176         for (i=0; i<ARRAY_SIZE(lvls); i++) {
 177                 if (!_test_IsPathReplicated(tctx, p,
 178                                             "C:\\windows\\sysvol\\domain",
 179                                             lvls[i])) {
 180                         ret = false;
 181                 }
 182         }
 183 
 184         return ret;
 185 }
 186 
 187 static bool test_ForceReplication(struct torture_context *tctx,
     /* [<][>][^][v][top][bottom][index][help] */
 188                                   struct dcerpc_pipe *p)
 189 {
 190         struct frsapi_ForceReplication r;
 191 
 192         ZERO_STRUCT(r);
 193 
 194         r.in.guid1 = NULL;
 195         r.in.guid2 = NULL;
 196         r.in.replica_set = talloc_asprintf(tctx, "%s",
 197                                            lp_realm(tctx->lp_ctx));
 198         r.in.partner_name = dcerpc_server_name(p);
 199 
 200         torture_assert_ntstatus_ok(tctx,
 201                 dcerpc_frsapi_ForceReplication(p, tctx, &r),
 202                 "ForceReplication failed");
 203 
 204         torture_assert_werr_ok(tctx, r.out.result,
 205                                "ForceReplication failed");
 206 
 207         return true;
 208 }
 209 
 210 static bool test_InfoW(struct torture_context *tctx,
     /* [<][>][^][v][top][bottom][index][help] */
 211                        struct dcerpc_pipe *p)
 212 {
 213         int i;
 214 
 215         for (i=0; i<10; i++) {
 216 
 217                 struct frsapi_InfoW r;
 218                 struct frsapi_Info *info;
 219                 int d;
 220                 DATA_BLOB blob;
 221 
 222                 ZERO_STRUCT(r);
 223 
 224                 info = talloc_zero(tctx, struct frsapi_Info);
 225 
 226                 r.in.length = 0x1000;
 227                 r.in.info = r.out.info = info;
 228 
 229                 info->length = r.in.length;
 230                 info->length2 = r.in.length;
 231                 info->level = i;
 232                 info->offset = 0x2c;
 233                 info->blob_len = 0x2c;
 234 
 235                 torture_assert_ntstatus_ok(tctx,
 236                         dcerpc_frsapi_InfoW(p, tctx, &r),
 237                         "InfoW failed");
 238 
 239                 torture_assert_werr_ok(tctx, r.out.result, "InfoW failed");
 240 
 241                 /* display the formatted blob text */
 242                 blob = r.out.info->blob;
 243                 for (d = 0; d < blob.length; d++) {
 244                         if (blob.data[d]) {
 245                                 printf("%c", blob.data[d]);
 246                         }
 247                 }
 248                 printf("\n");
 249         }
 250 
 251         return true;
 252 }
 253 
 254 struct torture_suite *torture_rpc_frsapi(TALLOC_CTX *mem_ctx)
     /* [<][>][^][v][top][bottom][index][help] */
 255 {
 256         struct torture_rpc_tcase *tcase;
 257         struct torture_suite *suite = torture_suite_create(mem_ctx, "FRSAPI");
 258         struct torture_test *test;
 259 
 260         tcase = torture_suite_add_rpc_iface_tcase(suite, "frsapi",
 261                                                   &ndr_table_frsapi);
 262 
 263         test = torture_rpc_tcase_add_test(tcase, "DsPollingIntervalW",
 264                                           test_DsPollingIntervalW);
 265 
 266         test = torture_rpc_tcase_add_test(tcase, "IsPathReplicated",
 267                                           test_IsPathReplicated);
 268 
 269         test = torture_rpc_tcase_add_test(tcase, "ForceReplication",
 270                                           test_ForceReplication);
 271 
 272         test = torture_rpc_tcase_add_test(tcase, "InfoW",
 273                                           test_InfoW);
 274         return suite;
 275 }

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