diff options
Diffstat (limited to 'source4/torture/smb2')
-rw-r--r-- | source4/torture/smb2/util.c | 107 |
1 files changed, 105 insertions, 2 deletions
diff --git a/source4/torture/smb2/util.c b/source4/torture/smb2/util.c index e7ac4db980..4fb7cfbef2 100644 --- a/source4/torture/smb2/util.c +++ b/source4/torture/smb2/util.c @@ -354,7 +354,7 @@ NTSTATUS torture_smb2_testdir(struct smb2_tree *tree, const char *fname, /* - create a complex file using the old SMB protocol, to make it easier to + create a complex file using SMB2, to make it easier to find fields in SMB2 getinfo levels */ NTSTATUS torture_setup_complex_file(struct smb2_tree *tree, const char *fname) @@ -367,7 +367,7 @@ NTSTATUS torture_setup_complex_file(struct smb2_tree *tree, const char *fname) /* - create a complex dir using the old SMB protocol, to make it easier to + create a complex dir using SMB2, to make it easier to find fields in SMB2 getinfo levels */ NTSTATUS torture_setup_complex_dir(struct smb2_tree *tree, const char *fname) @@ -403,3 +403,106 @@ NTSTATUS smb2_util_roothandle(struct smb2_tree *tree, struct smb2_handle *handle return NT_STATUS_OK; } + +/* Comparable to torture_setup_dir, but for SMB2. */ +bool smb2_util_setup_dir(struct torture_context *tctx, struct smb2_tree *tree, + const char *dname) +{ + NTSTATUS status; + + /* XXX: smb_raw_exit equivalent? + smb_raw_exit(cli->session); */ + if (smb2_deltree(tree, dname) == -1) { + torture_result(tctx, TORTURE_ERROR, "Unable to deltree when setting up %s.\n", dname); + return false; + } + + status = smb2_util_mkdir(tree, dname); + if (NT_STATUS_IS_ERR(status)) { + torture_result(tctx, TORTURE_ERROR, "Unable to mkdir when setting up %s - %s\n", dname, + nt_errstr(status)); + return false; + } + + return true; +} + +#define CHECK_STATUS(status, correct) do { \ + if (!NT_STATUS_EQUAL(status, correct)) { \ + torture_result(tctx, TORTURE_FAIL, "(%s) Incorrect status %s - should be %s\n", \ + __location__, nt_errstr(status), nt_errstr(correct)); \ + ret = false; \ + goto done; \ + }} while (0) + +/* + * Helper function to verify a security descriptor, by querying + * and comparing against the passed in sd. + */ +bool smb2_util_verify_sd(TALLOC_CTX *tctx, struct smb2_tree *tree, + struct smb2_handle handle, struct security_descriptor *sd) +{ + NTSTATUS status; + bool ret = true; + union smb_fileinfo q = {}, q2 = {}; + + if (sd) { + q.query_secdesc.level = RAW_FILEINFO_SEC_DESC; + q.query_secdesc.in.file.handle = handle; + q.query_secdesc.in.secinfo_flags = + SECINFO_OWNER | + SECINFO_GROUP | + SECINFO_DACL; + status = smb2_getinfo_file(tree, tctx, &q); + CHECK_STATUS(status, NT_STATUS_OK); + + if (!security_acl_equal( + q.query_secdesc.out.sd->dacl, sd->dacl)) { + torture_warning(tctx, "%s: security descriptors don't match!\n", + __location__); + torture_warning(tctx, "got:\n"); + NDR_PRINT_DEBUG(security_descriptor, + q.query_secdesc.out.sd); + torture_warning(tctx, "expected:\n"); + NDR_PRINT_DEBUG(security_descriptor, sd); + ret = false; + } + } + + done: + return ret; +} + +/* + * Helper function to verify attributes, by querying + * and comparing against the passed in attrib. + */ +bool smb2_util_verify_attrib(TALLOC_CTX *tctx, struct smb2_tree *tree, + struct smb2_handle handle, uint32_t attrib) +{ + NTSTATUS status; + bool ret = true; + union smb_fileinfo q = {}, q2 = {}; + + if (attrib) { + q2.standard.level = RAW_FILEINFO_STANDARD; + q2.standard.in.file.handle = handle; + status = smb2_getinfo_file(tree, tctx, &q2); + CHECK_STATUS(status, NT_STATUS_OK); + + q2.standard.out.attrib &= ~FILE_ATTRIBUTE_ARCHIVE; + + if (q2.standard.out.attrib != attrib) { + torture_warning(tctx, "%s: attributes don't match! " + "got %x, expected %x\n", __location__, + (uint32_t)q2.standard.out.attrib, + (uint32_t)attrib); + ret = false; + } + } + + done: + return ret; +} + + |