summaryrefslogtreecommitdiff
path: root/source4/torture/raw/composite.c
diff options
context:
space:
mode:
authorAlexander Bokovoy <ab@samba.org>2005-04-15 14:45:00 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:11:34 -0500
commit9779e6d670d19a5dfdc034084b580653d5ca0670 (patch)
tree41dd03bbb94b5c80bf8f3943c2a5b39ab101318b /source4/torture/raw/composite.c
parent7fc2109b9e5e3e1c100da9d9feb865ce412d8b0f (diff)
downloadsamba-9779e6d670d19a5dfdc034084b580653d5ca0670.tar.gz
samba-9779e6d670d19a5dfdc034084b580653d5ca0670.tar.bz2
samba-9779e6d670d19a5dfdc034084b580653d5ca0670.zip
r6352: Two new composite calls:
- qfsinfo (query file system information) - appendacl (append an ACL to existing file's security descriptor and get new full ACL) The second one also includes an improvement to security descriptor handling which allows to copy security descriptor. Written by Peter Novodvorsky <peter.novodvorsky@ru.ibm.com> Both functions have corresponding torture tests added. Tested under valgrind and work against Samba 4 and Windows XP. ToDo: document composite call creation process in prog_guide.txt (This used to be commit 441cff62ac75ed16851ce7b8daf9d03eb4c3ec79)
Diffstat (limited to 'source4/torture/raw/composite.c')
-rw-r--r--source4/torture/raw/composite.c187
1 files changed, 187 insertions, 0 deletions
diff --git a/source4/torture/raw/composite.c b/source4/torture/raw/composite.c
index f836e1eb4b..98615b7de4 100644
--- a/source4/torture/raw/composite.c
+++ b/source4/torture/raw/composite.c
@@ -25,6 +25,7 @@
#include "libcli/raw/libcliraw.h"
#include "libcli/composite/composite.h"
#include "lib/cmdline/popt_common.h"
+#include "librpc/gen_ndr/ndr_security.h"
#define BASEDIR "\\composite"
@@ -201,6 +202,190 @@ static BOOL test_fetchfile(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
return ret;
}
+/*
+ test setfileacl
+*/
+static BOOL test_appendacl(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
+{
+ struct smb_composite_appendacl **io;
+ struct smb_composite_appendacl **io_orig;
+ struct composite_context **c;
+ struct event_context *event_ctx;
+
+ struct security_descriptor *test_sd;
+ struct security_ace *ace;
+ struct dom_sid *test_sid;
+
+ const int num_ops = 50;
+ int *count = talloc_zero(mem_ctx, int);
+ struct smb_composite_savefile io1;
+
+ NTSTATUS status;
+ int i;
+
+ io_orig = talloc_array(mem_ctx, struct smb_composite_appendacl *, num_ops);
+
+ printf ("creating %d empty files and getting their acls with appendacl\n", num_ops);
+
+ for (i = 0; i < num_ops; i++) {
+ io1.in.fname = talloc_asprintf(io_orig, BASEDIR "\\test%d.txt", i);
+ io1.in.data = NULL;
+ io1.in.size = 0;
+
+ status = smb_composite_savefile(cli->tree, &io1);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("savefile failed: %s\n", nt_errstr(status));
+ return False;
+ }
+
+ io_orig[i] = talloc (io_orig, struct smb_composite_appendacl);
+ io_orig[i]->in.fname = talloc_steal(io_orig[i], io1.in.fname);
+ io_orig[i]->in.sd = security_descriptor_initialise(io_orig[i]);
+ status = smb_composite_appendacl(cli->tree, io_orig[i], io_orig[i]);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("appendacl failed: %s\n", nt_errstr(status));
+ return False;
+ }
+ }
+
+
+ /* fill Security Descriptor with aces to be added */
+
+ test_sd = security_descriptor_initialise(mem_ctx);
+ test_sid = dom_sid_parse_talloc (mem_ctx, "S-1-5-32-1234-5432");
+
+ ace = talloc_zero(mem_ctx, struct security_ace);
+
+ ace->type = SEC_ACE_TYPE_ACCESS_ALLOWED;
+ ace->flags = 0;
+ ace->access_mask = SEC_STD_ALL;
+ ace->trustee = *test_sid;
+
+ status = security_descriptor_dacl_add(test_sd, ace);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("appendacl failed: %s\n", nt_errstr(status));
+ return False;
+ }
+
+ /* set parameters for appendacl async call */
+
+ printf("testing parallel appendacl with %d ops\n", num_ops);
+
+ c = talloc_array(mem_ctx, struct composite_context *, num_ops);
+ io = talloc_array(mem_ctx, struct smb_composite_appendacl *, num_ops);
+
+ for (i=0; i < num_ops; i++) {
+ io[i] = talloc (io, struct smb_composite_appendacl);
+ io[i]->in.sd = test_sd;
+ io[i]->in.fname = talloc_asprintf(io[i], BASEDIR "\\test%d.txt", i);
+
+ c[i] = smb_composite_appendacl_send(cli->tree, io[i]);
+ c[i]->async.fn = loadfile_complete;
+ c[i]->async.private = count;
+ }
+
+ event_ctx = talloc_reference(mem_ctx, cli->tree->session->transport->socket->event.ctx);
+ printf("waiting for completion\n");
+ while (*count != num_ops) {
+ event_loop_once(event_ctx);
+ printf("count=%d\r", *count);
+ fflush(stdout);
+ }
+ printf("count=%d\n", *count);
+
+ for (i=0; i < num_ops; i++) {
+ struct security_descriptor sd;
+
+ status = smb_composite_appendacl_recv(c[i], io[i]);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("appendacl[%d] failed - %s\n", i, nt_errstr(status));
+ return False;
+ }
+
+ security_descriptor_dacl_add(io_orig[i]->out.sd, ace);
+ if (!security_acl_equal(io_orig[i]->out.sd->dacl, io[i]->out.sd->dacl)) {
+ printf("appendacl[%d] failed - needed acl isn't set\n", i);
+ return False;
+ }
+ }
+
+
+ talloc_free (ace);
+ talloc_free (test_sid);
+ talloc_free (test_sd);
+
+ return True;
+}
+
+/* test a query FS info by asking for share's GUID */
+static BOOL test_fsinfo(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
+{
+ char *guid = NULL;
+ NTSTATUS status;
+ struct smb_composite_fsinfo io1;
+ struct composite_context **c;
+
+ int i;
+ extern int torture_numops;
+ struct event_context *event_ctx;
+ int *count = talloc_zero(mem_ctx, int);
+ BOOL ret = True;
+
+ io1.in.dest_host = lp_parm_string(-1, "torture", "host");
+ io1.in.port = 0;
+ io1.in.called_name = lp_parm_string(-1, "torture", "host");
+ io1.in.service = lp_parm_string(-1, "torture", "share");
+ io1.in.service_type = "A:";
+ io1.in.credentials = cmdline_credentials;
+ io1.in.workgroup = lp_workgroup();
+ io1.in.level = RAW_QFS_OBJECTID_INFORMATION;
+
+ printf("testing parallel queryfsinfo [Object ID] with %d ops\n", torture_numops);
+
+ event_ctx = talloc_reference(mem_ctx, cli->tree->session->transport->socket->event.ctx);
+ c = talloc_array(mem_ctx, struct composite_context *, torture_numops);
+
+ for (i=0; i<torture_numops; i++) {
+ c[i] = smb_composite_fsinfo_send(cli->tree,&io1);
+ c[i]->async.fn = loadfile_complete;
+ c[i]->async.private = count;
+ }
+
+ printf("waiting for completion\n");
+
+ while (*count < torture_numops) {
+ event_loop_once(event_ctx);
+ printf("count=%d\r", *count);
+ fflush(stdout);
+ }
+ printf("count=%d\n", *count);
+
+ for (i=0;i<torture_numops;i++) {
+ status = smb_composite_fsinfo_recv(c[i], mem_ctx);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("fsinfo[%d] failed - %s\n", i, nt_errstr(status));
+ ret = False;
+ continue;
+ }
+
+ if (io1.out.fsinfo->generic.level != RAW_QFS_OBJECTID_INFORMATION) {
+ printf("wrong level in returned info - %d "
+ "should be %d\n",
+ io1.out.fsinfo->generic.level, RAW_QFS_OBJECTID_INFORMATION);
+ ret = False;
+ continue;
+ }
+
+ guid=GUID_string(mem_ctx, &io1.out.fsinfo->objectid_information.out.guid);
+ printf("[%d] GUID: %s\n", i, guid);
+
+
+ }
+
+ return ret;
+}
+
+
/*
basic testing of libcli composite calls
*/
@@ -222,6 +407,8 @@ BOOL torture_raw_composite(void)
ret &= test_fetchfile(cli, mem_ctx);
ret &= test_loadfile(cli, mem_ctx);
+ ret &= test_appendacl(cli, mem_ctx);
+ ret &= test_fsinfo(cli, mem_ctx);
smb_raw_exit(cli->session);
smbcli_deltree(cli->tree, BASEDIR);