spoolss: Make OpenPrinterEx work with NDR64 by using UserInfo Container.
authorGünther Deschner <gd@samba.org>
Mon, 14 Jan 2013 16:26:31 +0000 (17:26 +0100)
committerAndreas Schneider <asn@samba.org>
Wed, 16 Jan 2013 10:42:13 +0000 (11:42 +0100)
Guenther

Signed-off-by: Günther Deschner <gd@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
librpc/idl/spoolss.idl
source3/rpc_client/cli_spoolss.c
source3/rpc_server/spoolss/srv_spoolss_nt.c
source4/rpc_server/spoolss/dcesrv_spoolss.c
source4/torture/rpc/samba3rpc.c
source4/torture/rpc/spoolss.c
source4/torture/rpc/spoolss_access.c
source4/torture/rpc/spoolss_win.c

index 06a0935f81b7d382ec84cc8f6de2a3bdd8965213..7d8e8de3adf87ded4429966e877479cf4e2f50f4 100644 (file)
@@ -2821,8 +2821,7 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor")
                [in,unique]           [string,charset(UTF16)] uint16 *datatype,
                [in]                  spoolss_DevmodeContainer devmode_ctr,
                [in]                  spoolss_AccessRights access_mask,
-               [in]                  uint32 level,
-               [in,switch_is(level)] spoolss_UserLevel userlevel,
+               [in]                  spoolss_UserLevelCtr userlevel_ctr,
                [out,ref]             policy_handle *handle
        );
 
index 5c8448b29b6dbf6fb29084128758b1ce08a758b9..1a8903d82a154e1f86ef8f1f042133c960d07310 100644 (file)
@@ -40,7 +40,7 @@ WERROR rpccli_spoolss_openprinter_ex(struct rpc_pipe_client *cli,
        NTSTATUS status;
        WERROR werror;
        struct spoolss_DevmodeContainer devmode_ctr;
-       union spoolss_UserLevel userlevel;
+       struct spoolss_UserLevelCtr userlevel_ctr;
        struct spoolss_UserLevel1 level1;
        struct dcerpc_binding_handle *b = cli->binding_handle;
 
@@ -55,15 +55,15 @@ WERROR rpccli_spoolss_openprinter_ex(struct rpc_pipe_client *cli,
        level1.minor    = 0;
        level1.processor = 0;
 
-       userlevel.level1 = &level1;
+       userlevel_ctr.level = 1;
+       userlevel_ctr.user_info.level1 = &level1;
 
        status = dcerpc_spoolss_OpenPrinterEx(b, mem_ctx,
                                              printername,
                                              NULL,
                                              devmode_ctr,
                                              access_desired,
-                                             1, /* level */
-                                             userlevel,
+                                             userlevel_ctr,
                                              handle,
                                              &werror);
 
index 28ef836b4178f1e38971f81ebb095e1fa133c9aa..48a2981986c3bdc56d08e14aa192f3ce652ae9f3 100644 (file)
@@ -1632,15 +1632,17 @@ WERROR _spoolss_OpenPrinter(struct pipes_struct *p,
                            struct spoolss_OpenPrinter *r)
 {
        struct spoolss_OpenPrinterEx e;
+       struct spoolss_UserLevel1 level1;
        WERROR werr;
 
-       ZERO_STRUCT(e.in.userlevel);
+       ZERO_STRUCT(level1);
 
        e.in.printername        = r->in.printername;
        e.in.datatype           = r->in.datatype;
        e.in.devmode_ctr        = r->in.devmode_ctr;
        e.in.access_mask        = r->in.access_mask;
-       e.in.level              = 0;
+       e.in.userlevel_ctr.level                = 1;
+       e.in.userlevel_ctr.user_info.level1     = &level1;
 
        e.out.handle            = r->out.handle;
 
@@ -1714,12 +1716,12 @@ WERROR _spoolss_OpenPrinterEx(struct pipes_struct *p,
                return WERR_INVALID_PARAM;
        }
 
-       if (r->in.level > 3) {
+       if (r->in.userlevel_ctr.level > 3) {
                return WERR_INVALID_PARAM;
        }
-       if ((r->in.level == 1 && !r->in.userlevel.level1) ||
-           (r->in.level == 2 && !r->in.userlevel.level2) ||
-           (r->in.level == 3 && !r->in.userlevel.level3)) {
+       if ((r->in.userlevel_ctr.level == 1 && !r->in.userlevel_ctr.user_info.level1) ||
+           (r->in.userlevel_ctr.level == 2 && !r->in.userlevel_ctr.user_info.level2) ||
+           (r->in.userlevel_ctr.level == 3 && !r->in.userlevel_ctr.user_info.level3)) {
                return WERR_INVALID_PARAM;
        }
 
index 76035f3ce9326d0aace1760cb33584c444e07c4e..e3df4e0ff5e1c5730700067af87ba19e9b39d6cb 100644 (file)
@@ -269,9 +269,8 @@ static WERROR dcesrv_spoolss_OpenPrinter(struct dcesrv_call_state *dce_call, TAL
        r2->in.datatype         = r->in.datatype;
        r2->in.devmode_ctr      = r->in.devmode_ctr;
        r2->in.access_mask      = r->in.access_mask;
-       r2->in.level            = 1;
-       r2->in.userlevel.level1 = NULL;
-
+       r2->in.userlevel_ctr.level      = 1;
+       r2->in.userlevel_ctr.user_info.level1 = NULL;
        r2->out.handle          = r->out.handle;
 
        /* TODO: we should take care about async replies here,
index c19476d9bf1d6b3cabef379b6eec6a8ef05bee87..f7c76743aacde9f63d95c329951ebb3fed4ad249 100644 (file)
@@ -2804,8 +2804,8 @@ static bool torture_samba3_rpc_spoolss(struct torture_context *torture)
                                                   servername);
                r.in.datatype = NULL;
                r.in.access_mask = 0;
-               r.in.level = 1;
-               r.in.userlevel.level1 = &userlevel1;
+               r.in.userlevel_ctr.level = 1;
+               r.in.userlevel_ctr.user_info.level1 = &userlevel1;
                r.out.handle = &server_handle;
 
                torture_assert_ntstatus_ok(torture,
@@ -2836,8 +2836,8 @@ static bool torture_samba3_rpc_spoolss(struct torture_context *torture)
                        torture, "\\\\%s\\%s", servername, printers[0]);
                r.in.datatype = NULL;
                r.in.access_mask = 0;
-               r.in.level = 1;
-               r.in.userlevel.level1 = &userlevel1;
+               r.in.userlevel_ctr.level = 1;
+               r.in.userlevel_ctr.user_info.level1 = &userlevel1;
                r.out.handle = &printer_handle;
 
                torture_assert_ntstatus_ok(torture,
index b1229ac3aab836e54e49ffdb6afa65a7883d754f..064d3b434dab140b27ae0bd099137fff4e5001dd 100644 (file)
@@ -5777,8 +5777,8 @@ static bool test_OpenPrinter_badname(struct torture_context *tctx,
        opEx.in.datatype                = NULL;
        opEx.in.devmode_ctr.devmode     = NULL;
        opEx.in.access_mask             = 0;
-       opEx.in.level                   = 1;
-       opEx.in.userlevel.level1        = NULL;
+       opEx.in.userlevel_ctr.level             = 1;
+       opEx.in.userlevel_ctr.user_info.level1 = NULL;
        opEx.out.handle                 = &handle;
 
        torture_comment(tctx, "Testing OpenPrinterEx(%s) with bad name\n", opEx.in.printername);
@@ -5887,8 +5887,7 @@ static bool test_OpenPrinterEx(struct torture_context *tctx,
                               const char *datatype,
                               struct spoolss_DeviceMode *devmode,
                               uint32_t access_mask,
-                              uint32_t level,
-                              union spoolss_UserLevel *userlevel,
+                              struct spoolss_UserLevelCtr *userlevel_ctr,
                               struct policy_handle *handle,
                               WERROR expected_result)
 {
@@ -5898,8 +5897,7 @@ static bool test_OpenPrinterEx(struct torture_context *tctx,
        r.in.datatype           = datatype;
        r.in.devmode_ctr.devmode= devmode;
        r.in.access_mask        = access_mask;
-       r.in.level              = level;
-       r.in.userlevel          = *userlevel;
+       r.in.userlevel_ctr      = *userlevel_ctr;
        r.out.handle            = handle;
 
        torture_comment(tctx, "Testing OpenPrinterEx(%s)\n", r.in.printername);
@@ -5920,7 +5918,7 @@ static bool call_OpenPrinterEx(struct torture_context *tctx,
                               struct spoolss_DeviceMode *devmode,
                               struct policy_handle *handle)
 {
-       union spoolss_UserLevel userlevel;
+       struct spoolss_UserLevelCtr userlevel_ctr;
        struct spoolss_UserLevel1 userlevel1;
        struct dcerpc_binding_handle *b = p->binding_handle;
 
@@ -5932,12 +5930,12 @@ static bool call_OpenPrinterEx(struct torture_context *tctx,
        userlevel1.minor = 3;
        userlevel1.processor = 4;
 
-       userlevel.level1 = &userlevel1;
+       userlevel_ctr.level = 1;
+       userlevel_ctr.user_info.level1 = &userlevel1;
 
        return test_OpenPrinterEx(tctx, b, name, NULL, devmode,
                                  SEC_FLAG_MAXIMUM_ALLOWED,
-                                 1,
-                                 &userlevel,
+                                 &userlevel_ctr,
                                  handle,
                                  WERR_OK);
 }
@@ -6041,7 +6039,7 @@ static bool test_openprinter(struct torture_context *tctx,
                             struct dcerpc_binding_handle *b,
                             const char *real_printername)
 {
-       union spoolss_UserLevel userlevel;
+       struct spoolss_UserLevelCtr userlevel_ctr;
        struct policy_handle handle;
        struct spoolss_UserLevel1 userlevel1;
        const char *printername = NULL;
@@ -6119,13 +6117,14 @@ static bool test_openprinter(struct torture_context *tctx,
        userlevel1.minor = 3;
        userlevel1.processor = 4;
 
-       userlevel.level1 = &userlevel1;
+       userlevel_ctr.level = 1;
+       userlevel_ctr.user_info.level1 = &userlevel1;
 
        torture_comment(tctx, "Testing openprinterex printername pattern\n");
 
        torture_assert(tctx,
-               test_OpenPrinterEx(tctx, b, real_printername, NULL, NULL, 0, 1,
-                                  &userlevel, &handle,
+               test_OpenPrinterEx(tctx, b, real_printername, NULL, NULL, 0,
+                                  &userlevel_ctr, &handle,
                                   WERR_OK),
                "OpenPrinterEx failed");
        test_ClosePrinter(tctx, b, &handle);
@@ -6137,8 +6136,8 @@ static bool test_openprinter(struct torture_context *tctx,
                                              tests[i].suffix);
 
                torture_assert(tctx,
-                       test_OpenPrinterEx(tctx, b, printername, NULL, NULL, 0, 1,
-                                          &userlevel, &handle,
+                       test_OpenPrinterEx(tctx, b, printername, NULL, NULL, 0,
+                                          &userlevel_ctr, &handle,
                                           tests[i].expected_result),
                        "OpenPrinterEx failed");
                if (W_ERROR_IS_OK(tests[i].expected_result)) {
@@ -7335,8 +7334,8 @@ static bool test_architecture_buffer(struct torture_context *tctx,
                r.in.datatype           = NULL;
                r.in.devmode_ctr.devmode= NULL;
                r.in.access_mask        = SEC_FLAG_MAXIMUM_ALLOWED;
-               r.in.level               = 1;
-               r.in.userlevel.level1   = &u1;
+               r.in.userlevel_ctr.level = 1;
+               r.in.userlevel_ctr.user_info.level1 = &u1;
                r.out.handle            = &handle;
 
                torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_OpenPrinterEx_r(b, tctx, &r), "");
index a935cbd3c3445b071f002d84815da44e93502e9d..411dac1fdcf7a497996f2b0a5233becff39475d7 100644 (file)
@@ -83,8 +83,8 @@ static bool test_openprinter_handle(struct torture_context *tctx,
        r.in.datatype           = NULL;
        r.in.devmode_ctr.devmode= NULL;
        r.in.access_mask        = access_mask;
-       r.in.level              = 1;
-       r.in.userlevel.level1   = &level1;
+       r.in.userlevel_ctr.level = 1;
+       r.in.userlevel_ctr.user_info.level1 = &level1;
        r.out.handle            = handle;
 
        torture_comment(tctx, "Testing OpenPrinterEx(%s) with access_mask 0x%08x (%s)\n",
index 96c3a2455dbe397c8837e7ad472f426fdba7f370..bda0f3a832e8572c780be968c4f879ebeb9a6428 100644 (file)
@@ -54,8 +54,8 @@ static bool test_OpenPrinterEx(struct torture_context *tctx,
        op.in.datatype                  = NULL;
        op.in.devmode_ctr.devmode       = NULL;
        op.in.access_mask               = access_mask;
-       op.in.level                     = 1;
-       op.in.userlevel.level1          = &ul_1;
+       op.in.userlevel_ctr.level       = 1;
+       op.in.userlevel_ctr.user_info.level1 = &ul_1;
        op.out.handle                   = handle;
 
        ul_1.size                       = 1234;
@@ -95,8 +95,8 @@ static bool test_OpenPrinterAsAdmin(struct torture_context *tctx,
        op.in.datatype                  = NULL;
        op.in.devmode_ctr.devmode       = NULL;
        op.in.access_mask               = SERVER_ALL_ACCESS;
-       op.in.level                     = 1;
-       op.in.userlevel.level1          = &ul_1;
+       op.in.userlevel_ctr.level       = 1;
+       op.in.userlevel_ctr.user_info.level1 = &ul_1;
        op.out.handle                   = &handle;
 
        cp.in.handle                    = &handle;