summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/torture/rpc/spoolss.c308
1 files changed, 179 insertions, 129 deletions
diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index 7d5594cf17..893ac29ecd 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -38,6 +38,8 @@
#define TORTURE_WELLKNOWN_PRINTER_EX "torture_wkn_printer_ex"
#define TORTURE_PRINTER_EX "torture_printer_ex"
+#define TOP_LEVEL_PRINTER_KEY "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers"
+
struct test_spoolss_context {
/* print server handle */
struct policy_handle server_handle;
@@ -3178,122 +3180,6 @@ static bool test_DeletePrinterKey(struct torture_context *tctx,
return true;
}
-static bool test_SetPrinterData(struct torture_context *tctx,
- struct dcerpc_pipe *p,
- struct policy_handle *handle,
- const char *value_name,
- uint8_t *data,
- uint32_t offered)
-{
- struct spoolss_SetPrinterData r;
-
- r.in.handle = handle;
- r.in.value_name = value_name;
- r.in.data = data;
- r.in.offered = offered;
-
- torture_comment(tctx, "Testing SetPrinterData(%s)\n",
- r.in.value_name);
-
- torture_assert_ntstatus_ok(tctx,
- dcerpc_spoolss_SetPrinterData(p, tctx, &r),
- "SetPrinterData failed");
- torture_assert_werr_ok(tctx, r.out.result,
- "SetPrinterData failed");
-
- return true;
-}
-
-static bool test_SetPrinterData_matrix(struct torture_context *tctx,
- struct dcerpc_pipe *p,
- struct policy_handle *handle)
-{
- const char *values[] = {
- "spootyfoot",
- "spooty\\foot",
-#if 0
- /* FIXME: not working with s3 atm. */
- "spooty,foot",
- "spooty,fo,ot",
-#endif
- "spooty foot",
-#if 0
- /* FIXME: not working with s3 atm. */
- "spooty\\fo,ot",
- "spooty,fo\\ot"
-#endif
- };
- int i;
-
- for (i=0; i < ARRAY_SIZE(values); i++) {
-
- enum winreg_Type type;
- DATA_BLOB blob;
- uint8_t *data;
- uint32_t needed;
-
- torture_assert(tctx,
- reg_string_to_val(tctx, lp_iconv_convenience(tctx->lp_ctx),
- "REG_SZ", "dog", &type, &blob), "");
-
- torture_assert(tctx,
- test_SetPrinterData(tctx, p, handle, values[i], blob.data, blob.length),
- "SetPrinterData failed");
-
- torture_assert(tctx,
- test_GetPrinterData(tctx, p, handle, values[i], &type, &data, &needed),
- "GetPrinterData failed");
-
- torture_assert(tctx,
- test_DeletePrinterData(tctx, p, handle, values[i]),
- "DeletePrinterData failed");
-
- torture_assert_int_equal(tctx, type, REG_SZ, "type mismatch");
- torture_assert_int_equal(tctx, needed, blob.length, "size mismatch");
- torture_assert_mem_equal(tctx, data, blob.data, blob.length, "buffer mismatch");
- }
-
- return true;
-}
-
-static bool test_EnumPrinterKey(struct torture_context *tctx,
- struct dcerpc_pipe *p,
- struct policy_handle *handle,
- const char *key_name,
- const char ***array);
-
-static bool test_SetPrinterDataEx(struct torture_context *tctx,
- struct dcerpc_pipe *p,
- struct policy_handle *handle,
- const char *key_name,
- const char *value_name,
- enum winreg_Type type,
- uint8_t *data,
- uint32_t offered)
-{
- NTSTATUS status;
- struct spoolss_SetPrinterDataEx r;
-
- r.in.handle = handle;
- r.in.key_name = key_name;
- r.in.value_name = value_name;
- r.in.type = type;
- r.in.data = data;
- r.in.offered = offered;
-
- torture_comment(tctx, "Testing SetPrinterDataEx(%s - %s) type: %s, offered: 0x%08x\n",
- r.in.key_name, r.in.value_name, str_regtype(r.in.type), r.in.offered);
-
- status = dcerpc_spoolss_SetPrinterDataEx(p, tctx, &r);
-
- torture_assert_ntstatus_ok(tctx, status, "SetPrinterDataEx failed");
- torture_assert_werr_ok(tctx, r.out.result, "SetPrinterDataEx failed");
-
- return true;
-}
-
-#define TOP_LEVEL_PRINTER_KEY "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers"
-
static bool test_winreg_OpenHKLM(struct torture_context *tctx,
struct dcerpc_pipe *p,
struct policy_handle *handle)
@@ -3422,6 +3308,173 @@ bool test_winreg_QueryValue(struct torture_context *tctx,
return true;
}
+static bool test_winreg_query_printerdata(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ struct policy_handle *handle,
+ const char *printer_name,
+ const char *key_name,
+ const char *value_name,
+ enum winreg_Type *w_type,
+ uint32_t *w_size,
+ uint32_t *w_length,
+ uint8_t **w_data)
+{
+ const char *printer_key;
+ struct policy_handle key_handle;
+
+ printer_key = talloc_asprintf(tctx, "%s\\%s\\%s",
+ TOP_LEVEL_PRINTER_KEY, printer_name, key_name);
+
+ torture_assert(tctx,
+ test_winreg_OpenKey(tctx, p, handle, printer_key, &key_handle), "");
+
+ torture_assert(tctx,
+ test_winreg_QueryValue(tctx, p, &key_handle, value_name, w_type, w_size, w_length, w_data), "");
+
+ torture_assert(tctx,
+ test_winreg_CloseKey(tctx, p, &key_handle), "");
+
+ return true;
+}
+
+static bool test_SetPrinterData(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ struct policy_handle *handle,
+ const char *value_name,
+ enum winreg_Type type,
+ uint8_t *data,
+ uint32_t offered)
+{
+ struct spoolss_SetPrinterData r;
+
+ r.in.handle = handle;
+ r.in.value_name = value_name;
+ r.in.type = type;
+ r.in.data = data;
+ r.in.offered = offered;
+
+ torture_comment(tctx, "Testing SetPrinterData(%s)\n",
+ r.in.value_name);
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_spoolss_SetPrinterData(p, tctx, &r),
+ "SetPrinterData failed");
+ torture_assert_werr_ok(tctx, r.out.result,
+ "SetPrinterData failed");
+
+ return true;
+}
+
+static bool test_SetPrinterData_matrix(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ struct policy_handle *handle,
+ const char *printer_name,
+ struct dcerpc_pipe *winreg_pipe,
+ struct policy_handle *hive_handle)
+{
+ const char *values[] = {
+ "spootyfoot",
+ "spooty\\foot",
+#if 0
+ /* FIXME: not working with s3 atm. */
+ "spooty,foot",
+ "spooty,fo,ot",
+#endif
+ "spooty foot",
+#if 0
+ /* FIXME: not working with s3 atm. */
+ "spooty\\fo,ot",
+ "spooty,fo\\ot"
+#endif
+ };
+ int i;
+
+ for (i=0; i < ARRAY_SIZE(values); i++) {
+
+ enum winreg_Type type;
+ DATA_BLOB blob;
+ uint8_t *data;
+ uint32_t needed;
+
+ torture_assert(tctx,
+ reg_string_to_val(tctx, lp_iconv_convenience(tctx->lp_ctx),
+ "REG_SZ", "dog", &type, &blob), "");
+
+ torture_assert(tctx,
+ test_SetPrinterData(tctx, p, handle, values[i], REG_SZ, blob.data, blob.length),
+ "SetPrinterData failed");
+
+ torture_assert(tctx,
+ test_GetPrinterData(tctx, p, handle, values[i], &type, &data, &needed),
+ "GetPrinterData failed");
+
+ torture_assert_int_equal(tctx, type, REG_SZ, "type mismatch");
+ torture_assert_int_equal(tctx, needed, blob.length, "size mismatch");
+ torture_assert_mem_equal(tctx, data, blob.data, blob.length, "buffer mismatch");
+
+ if (winreg_pipe && hive_handle) {
+
+ enum winreg_Type w_type;
+ uint32_t w_size;
+ uint32_t w_length;
+ uint8_t *w_data;
+
+ torture_assert(tctx,
+ test_winreg_query_printerdata(tctx, winreg_pipe, hive_handle,
+ printer_name, "PrinterDriverData", values[i],
+ &w_type, &w_size, &w_length, &w_data), "");
+
+ torture_assert_int_equal(tctx, w_type, REG_SZ, "winreg type mismatch");
+ torture_assert_int_equal(tctx, w_size, blob.length, "winreg size mismatch");
+ torture_assert_int_equal(tctx, w_length, blob.length, "winreg length mismatch");
+ torture_assert_mem_equal(tctx, w_data, blob.data, blob.length, "winreg buffer mismatch");
+ }
+
+ torture_assert(tctx,
+ test_DeletePrinterData(tctx, p, handle, values[i]),
+ "DeletePrinterData failed");
+ }
+
+ return true;
+}
+
+
+static bool test_EnumPrinterKey(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ struct policy_handle *handle,
+ const char *key_name,
+ const char ***array);
+
+static bool test_SetPrinterDataEx(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ struct policy_handle *handle,
+ const char *key_name,
+ const char *value_name,
+ enum winreg_Type type,
+ uint8_t *data,
+ uint32_t offered)
+{
+ NTSTATUS status;
+ struct spoolss_SetPrinterDataEx r;
+
+ r.in.handle = handle;
+ r.in.key_name = key_name;
+ r.in.value_name = value_name;
+ r.in.type = type;
+ r.in.data = data;
+ r.in.offered = offered;
+
+ torture_comment(tctx, "Testing SetPrinterDataEx(%s - %s) type: %s, offered: 0x%08x\n",
+ r.in.key_name, r.in.value_name, str_regtype(r.in.type), r.in.offered);
+
+ status = dcerpc_spoolss_SetPrinterDataEx(p, tctx, &r);
+
+ torture_assert_ntstatus_ok(tctx, status, "SetPrinterDataEx failed");
+ torture_assert_werr_ok(tctx, r.out.result, "SetPrinterDataEx failed");
+
+ return true;
+}
+
static bool test_SetPrinterDataEx_matrix(struct torture_context *tctx,
struct dcerpc_pipe *p,
struct policy_handle *handle,
@@ -3519,24 +3572,20 @@ static bool test_SetPrinterDataEx_matrix(struct torture_context *tctx,
}
if (winreg_pipe && hive_handle) {
- const char *printer_key;
- struct policy_handle key_handle;
+
enum winreg_Type w_type;
- uint32_t w_size, w_length;
+ uint32_t w_size;
+ uint32_t w_length;
uint8_t *w_data;
- printer_key = talloc_asprintf(tctx, "%s\\%s\\%s",
- TOP_LEVEL_PRINTER_KEY, printername, keys[i]);
-
- torture_assert(tctx, test_winreg_OpenKey(tctx, winreg_pipe, hive_handle, printer_key, &key_handle), "");
-
torture_assert(tctx,
- test_winreg_QueryValue(tctx, winreg_pipe, &key_handle, value_name, &w_type, &w_size, &w_length, &w_data), "");
-
- test_winreg_CloseKey(tctx, winreg_pipe, &key_handle);
+ test_winreg_query_printerdata(tctx, winreg_pipe, hive_handle,
+ printername, keys[i], value_name,
+ &w_type, &w_size, &w_length, &w_data), "");
torture_assert_int_equal(tctx, w_type, types[t], "winreg type mismatch");
torture_assert_int_equal(tctx, w_size, offered, "winreg size mismatch");
+ torture_assert_int_equal(tctx, w_length, offered, "winreg length mismatch");
torture_assert_mem_equal(tctx, w_data, data.data, offered, "winreg buffer mismatch");
}
@@ -3598,7 +3647,8 @@ static bool test_PrinterData_winreg(struct torture_context *tctx,
torture_assert(tctx, test_winreg_OpenHKLM(tctx, p2, &hive_handle), "");
- ret = test_SetPrinterDataEx_matrix(tctx, p, handle, printer_name, p2, &hive_handle);
+ ret &= test_SetPrinterData_matrix(tctx, p, handle, printer_name, p2, &hive_handle);
+ ret &= test_SetPrinterDataEx_matrix(tctx, p, handle, printer_name, p2, &hive_handle);
test_winreg_CloseKey(tctx, p2, &hive_handle);
@@ -4016,7 +4066,7 @@ static bool test_OpenPrinterEx(struct torture_context *tctx,
ret = false;
}
- if (!test_SetPrinterData_matrix(tctx, p, &handle)) {
+ if (!test_SetPrinterData_matrix(tctx, p, &handle, name, NULL, NULL)) {
ret = false;
}