LCOV - code coverage report
Current view: top level - source4/torture/rap - rap.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 92 124 74.2 %
Date: 2024-04-21 15:09:00 Functions: 8 9 88.9 %

          Line data    Source code
       1             : /* 
       2             :    Unix SMB/CIFS implementation.
       3             :    test suite for various RAP operations
       4             :    Copyright (C) Volker Lendecke 2004
       5             :    Copyright (C) Tim Potter 2005
       6             :    Copyright (C) Jelmer Vernooij 2007
       7             :    Copyright (C) Guenther Deschner 2010
       8             :    
       9             :    This program is free software; you can redistribute it and/or modify
      10             :    it under the terms of the GNU General Public License as published by
      11             :    the Free Software Foundation; either version 3 of the License, or
      12             :    (at your option) any later version.
      13             :    
      14             :    This program is distributed in the hope that it will be useful,
      15             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      16             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17             :    GNU General Public License for more details.
      18             :    
      19             :    You should have received a copy of the GNU General Public License
      20             :    along with this program.  If not, see <http://www.gnu.org/licenses/>.
      21             : */
      22             : 
      23             : #include "includes.h"
      24             : #include "libcli/libcli.h"
      25             : #include "torture/smbtorture.h"
      26             : #include "torture/util.h"
      27             : #include "param/param.h"
      28             : #include "libcli/rap/rap.h"
      29             : #include "torture/rap/proto.h"
      30             : 
      31           4 : static bool test_netshareenum(struct torture_context *tctx, 
      32             :                               struct smbcli_state *cli)
      33             : {
      34           0 :         struct rap_NetShareEnum r;
      35           0 :         int i;
      36             : 
      37           4 :         r.in.level = 1;
      38           4 :         r.in.bufsize = 8192;
      39             : 
      40           4 :         torture_assert_ntstatus_ok(tctx, 
      41             :                 smbcli_rap_netshareenum(cli->tree, tctx, &r), "");
      42             : 
      43         174 :         for (i=0; i<r.out.count; i++) {
      44         170 :                 printf("%s %d %s\n", r.out.info[i].info1.share_name,
      45         170 :                        r.out.info[i].info1.share_type,
      46         170 :                        r.out.info[i].info1.comment);
      47             :         }
      48             : 
      49           4 :         return true;
      50             : }
      51             : 
      52           4 : static bool test_netserverenum(struct torture_context *tctx, 
      53             :                                struct smbcli_state *cli)
      54             : {
      55           0 :         struct rap_NetServerEnum2 r;
      56           0 :         int i;
      57             : 
      58           4 :         r.in.level = 0;
      59           4 :         r.in.bufsize = 8192;
      60           4 :         r.in.servertype = 0xffffffff;
      61           4 :         r.in.servertype = 0x80000000;
      62           4 :         r.in.domain = NULL;
      63             : 
      64           4 :         torture_assert_ntstatus_ok(tctx, 
      65             :                    smbcli_rap_netserverenum2(cli->tree, tctx, &r), "");
      66             : 
      67          12 :         for (i=0; i<r.out.count; i++) {
      68           8 :                 switch (r.in.level) {
      69           8 :                 case 0:
      70           8 :                         printf("%s\n", r.out.info[i].info0.name);
      71           8 :                         break;
      72           0 :                 case 1:
      73           0 :                         printf("%s %x %s\n", r.out.info[i].info1.name,
      74           0 :                                r.out.info[i].info1.servertype,
      75           0 :                                r.out.info[i].info1.comment);
      76           0 :                         break;
      77             :                 }
      78             :         }
      79             : 
      80           4 :         return true;
      81             : }
      82             : 
      83           4 : static bool test_netservergetinfo(struct torture_context *tctx, 
      84             :                                   struct smbcli_state *cli)
      85             : {
      86           0 :         struct rap_WserverGetInfo r;
      87           4 :         bool res = true;
      88             : 
      89           4 :         r.in.bufsize = 0xffff;
      90             : 
      91           4 :         r.in.level = 0;
      92           4 :         torture_assert_ntstatus_ok(tctx,
      93             :                 smbcli_rap_netservergetinfo(cli->tree, tctx, &r),
      94             :                 "rap_netservergetinfo level 0 failed");
      95           4 :         torture_assert_werr_ok(tctx, W_ERROR(r.out.status),
      96             :                 "rap_netservergetinfo level 0 failed");
      97             : 
      98           4 :         r.in.level = 1;
      99           4 :         torture_assert_ntstatus_ok(tctx,
     100             :                 smbcli_rap_netservergetinfo(cli->tree, tctx, &r),
     101             :                 "rap_netservergetinfo level 1 failed");
     102           4 :         torture_assert_werr_ok(tctx, W_ERROR(r.out.status),
     103             :                 "rap_netservergetinfo level 1 failed");
     104             : 
     105           4 :         return res;
     106             : }
     107             : 
     108           4 : static bool test_netsessionenum(struct torture_context *tctx,
     109             :                                 struct smbcli_state *cli)
     110             : {
     111           0 :         struct rap_NetSessionEnum r;
     112           0 :         int i,n;
     113           4 :         uint16_t levels[] = { 2 };
     114             : 
     115           8 :         for (i=0; i < ARRAY_SIZE(levels); i++) {
     116             : 
     117           4 :                 r.in.level = levels[i];
     118           4 :                 r.in.bufsize = 8192;
     119             : 
     120           4 :                 torture_comment(tctx,
     121           4 :                         "Testing rap_NetSessionEnum level %d\n", r.in.level);
     122             : 
     123           4 :                 torture_assert_ntstatus_ok(tctx,
     124             :                         smbcli_rap_netsessionenum(cli->tree, tctx, &r),
     125             :                         "smbcli_rap_netsessionenum failed");
     126           4 :                 torture_assert_werr_ok(tctx, W_ERROR(r.out.status),
     127             :                         "smbcli_rap_netsessionenum failed");
     128             : 
     129           6 :                 for (n=0; n < r.out.count; n++) {
     130           2 :                         switch (r.in.level) {
     131           2 :                         case 2:
     132           2 :                                 torture_comment(tctx, "ComputerName: %s\n",
     133           2 :                                         r.out.info[n].info2.ComputerName);
     134             : 
     135           2 :                                 torture_comment(tctx, "UserName: %s\n",
     136           2 :                                         r.out.info[n].info2.UserName);
     137             : 
     138           2 :                                 torture_assert(tctx, r.out.info[n].info2.ComputerName,
     139             :                                         "ComputerName empty");
     140           2 :                                 torture_assert(tctx, r.out.info[n].info2.UserName,
     141             :                                         "UserName empty");
     142           2 :                                 break;
     143           0 :                         default:
     144           0 :                                 break;
     145             :                         }
     146             :                 }
     147             :         }
     148             : 
     149           4 :         return true;
     150             : }
     151             : 
     152           2 : static bool test_netsessiongetinfo_bysession(struct torture_context *tctx,
     153             :                                              struct smbcli_state *cli,
     154             :                                              const char *session)
     155             : {
     156           0 :         struct rap_NetSessionGetInfo r;
     157           0 :         int i;
     158           2 :         uint16_t levels[] = { 2 };
     159             : 
     160           2 :         if (session && session[0] == '\\' && session[1] == '\\') {
     161           0 :                 r.in.SessionName = session;
     162             :         } else {
     163           2 :                 r.in.SessionName = talloc_asprintf(tctx, "\\\\%s", session);
     164             :         }
     165           2 :         r.in.bufsize = 0xffff;
     166             : 
     167           2 :         for (i=0; i < ARRAY_SIZE(levels); i++) {
     168             : 
     169           2 :                 r.in.level = levels[i];
     170             : 
     171           2 :                 torture_assert_ntstatus_ok(tctx,
     172             :                         smbcli_rap_netsessiongetinfo(cli->tree, tctx, &r),
     173             :                         "rap_netsessiongetinfo failed");
     174           0 :                 torture_assert_werr_ok(tctx, W_ERROR(r.out.status),
     175             :                         "rap_netsessiongetinfo failed");
     176             :         }
     177             : 
     178           0 :         return true;
     179             : }
     180             : 
     181           4 : static bool test_netsessiongetinfo(struct torture_context *tctx,
     182             :                                    struct smbcli_state *cli)
     183             : {
     184           0 :         struct rap_NetSessionEnum r;
     185           0 :         int i,n;
     186           4 :         uint16_t levels[] = { 2 };
     187             : 
     188           6 :         for (i=0; i < ARRAY_SIZE(levels); i++) {
     189             : 
     190           4 :                 r.in.level = levels[i];
     191           4 :                 r.in.bufsize = 8192;
     192             : 
     193           4 :                 torture_assert_ntstatus_ok(tctx,
     194             :                         smbcli_rap_netsessionenum(cli->tree, tctx, &r),
     195             :                         "smbcli_rap_netsessionenum failed");
     196           4 :                 torture_assert_werr_ok(tctx, W_ERROR(r.out.status),
     197             :                         "smbcli_rap_netsessionenum failed");
     198             : 
     199           4 :                 for (n=0; n < r.out.count; n++) {
     200           2 :                         torture_assert(tctx,
     201             :                                 test_netsessiongetinfo_bysession(tctx, cli, r.out.info[n].info2.ComputerName),
     202             :                                 "failed to query sessioninfo");
     203             :                 }
     204             :         }
     205             : 
     206           2 :         return true;
     207             : }
     208             : 
     209           4 : static bool test_netremotetod(struct torture_context *tctx,
     210             :                               struct smbcli_state *cli)
     211             : {
     212           0 :         struct rap_NetRemoteTOD r;
     213             : 
     214           4 :         r.in.bufsize = 8192;
     215             : 
     216           4 :         torture_assert_ntstatus_ok(tctx,
     217             :                 smbcli_rap_netremotetod(cli->tree, tctx, &r),
     218             :                 "smbcli_rap_netremotetod failed");
     219           4 :         torture_assert_werr_ok(tctx, W_ERROR(r.out.status),
     220             :                 "smbcli_rap_netremotetod failed");
     221             : 
     222           4 :         return true;
     223             : }
     224             : 
     225           0 : bool torture_rap_scan(struct torture_context *torture, struct smbcli_state *cli)
     226             : {
     227           0 :         int callno;
     228             : 
     229           0 :         for (callno = 0; callno < 0xffff; callno++) {
     230           0 :                 struct rap_call *call = new_rap_cli_call(torture, callno);
     231           0 :                 NTSTATUS result;
     232             : 
     233           0 :                 result = rap_cli_do_call(cli->tree, call);
     234             : 
     235           0 :                 if (!NT_STATUS_EQUAL(result, NT_STATUS_INVALID_PARAMETER))
     236           0 :                         continue;
     237             : 
     238           0 :                 printf("callno %d is RAP call\n", callno);
     239             :         }
     240             : 
     241           0 :         return true;
     242             : }
     243             : 
     244        2354 : NTSTATUS torture_rap_init(TALLOC_CTX *ctx)
     245             : {
     246        2354 :         struct torture_suite *suite = torture_suite_create(ctx, "rap");
     247        2354 :         struct torture_suite *suite_basic = torture_suite_create(suite, "basic");
     248             : 
     249        2354 :         torture_suite_add_suite(suite, suite_basic);
     250        2354 :         torture_suite_add_suite(suite, torture_rap_rpc(suite));
     251        2354 :         torture_suite_add_suite(suite, torture_rap_printing(suite));
     252        2354 :         torture_suite_add_suite(suite, torture_rap_sam(suite));
     253             : 
     254        2354 :         torture_suite_add_1smb_test(suite_basic, "netserverenum", 
     255             :                                     test_netserverenum);
     256        2354 :         torture_suite_add_1smb_test(suite_basic, "netshareenum",
     257             :                                     test_netshareenum);
     258        2354 :         torture_suite_add_1smb_test(suite_basic, "netservergetinfo",
     259             :                                     test_netservergetinfo);
     260        2354 :         torture_suite_add_1smb_test(suite_basic, "netsessionenum",
     261             :                                     test_netsessionenum);
     262        2354 :         torture_suite_add_1smb_test(suite_basic, "netsessiongetinfo",
     263             :                                     test_netsessiongetinfo);
     264        2354 :         torture_suite_add_1smb_test(suite_basic, "netremotetod",
     265             :                                     test_netremotetod);
     266             : 
     267        2354 :         torture_suite_add_1smb_test(suite, "scan", torture_rap_scan);
     268             : 
     269        2354 :         suite->description = talloc_strdup(suite, 
     270             :                                                 "Remote Administration Protocol tests");
     271             : 
     272        2354 :         torture_register_suite(ctx, suite);
     273             : 
     274        2354 :         return NT_STATUS_OK;
     275             : }

Generated by: LCOV version 1.14