added OpenPrinter and a test function. Note that the Samba3 structure
authorAndrew Tridgell <tridge@samba.org>
Mon, 17 Nov 2003 03:38:13 +0000 (03:38 +0000)
committerAndrew Tridgell <tridge@samba.org>
Mon, 17 Nov 2003 03:38:13 +0000 (03:38 +0000)
for OpenPrinter was wrong.
(This used to be commit 186ddbbf8774d0960852ea9186c8e4e6f7be7a0f)

source4/include/cli_context.h
source4/libcli/raw/clitransport.c
source4/librpc/idl/spoolss.idl
source4/librpc/ndr/ndr_spoolss.c
source4/librpc/ndr/ndr_spoolss.h
source4/librpc/rpc/dcerpc.c
source4/librpc/rpc/rpc_spoolss.c
source4/torture/rpc/spoolss.c

index e74262fa8125953f77e80e8c2c127515a2fd2fd2..bffb6c9f6a53dbb61c7ed8c3232bda9e17bc5d79 100644 (file)
@@ -161,6 +161,10 @@ struct cli_transport {
 
        /* a list of async requests that are pending on this connection */
        struct cli_request *pending_requests;
+
+       /* remember the called name - some sub-protocols require us to
+          know the server name */
+       struct nmb_name called;
 };
 
 /* this is the context for the user */
index 80bb1e301f9e44914063bc93f96ec64f5d42e779..2d614cc3bdfded5d9f03f9f5ec28651997f6ecdc 100644 (file)
@@ -42,6 +42,8 @@ struct cli_transport *cli_transport_init(struct cli_socket *sock)
        cli_null_set_signing(transport);
        transport->socket->reference_count++;
 
+       ZERO_STRUCT(transport->called);
+
        return transport;
 }
 
@@ -71,6 +73,10 @@ BOOL cli_transport_connect(struct cli_transport *transport,
        int len = NBT_HDR_SIZE;
        struct cli_request *req;
 
+       if (called) {
+               transport->called = *called;
+       }
+
        /* 445 doesn't have session request */
        if (transport->socket->port == 445) {
                return True;
index 515ac0fd51ac94f940c95897c1f0e2427c4df6cb..be6f9a8f51688c8525aeeec1fbd54fdc289880d6 100644 (file)
 
        /******************/
        /* Function: 0x01 */
-       NTSTATUS spoolss_01(
+       WERROR spoolss_OpenPrinter(
+               [in]        unistr *server,
+               [in]        unistr *printer,
+               [in]        DATA_BLOB *buffer,
+               [in]        uint32 access_mask,
+               [out,ref]   policy_handle *handle
                );
 
        /******************/
index f88e46890ac3696a063c574d75c7186b41a937a9..5b64f9067a9f1f2b9b23bdc5f95737e0d306ee50 100644 (file)
@@ -292,8 +292,21 @@ NTSTATUS ndr_push_spoolss_EnumPrinters(struct ndr_push *ndr, struct spoolss_Enum
        return NT_STATUS_OK;
 }
 
-NTSTATUS ndr_push_spoolss_01(struct ndr_push *ndr, struct spoolss_01 *r)
+NTSTATUS ndr_push_spoolss_OpenPrinter(struct ndr_push *ndr, struct spoolss_OpenPrinter *r)
 {
+       NDR_CHECK(ndr_push_ptr(ndr, r->in.server));
+       if (r->in.server) {
+               NDR_CHECK(ndr_push_unistr(ndr, r->in.server));
+       }
+       NDR_CHECK(ndr_push_ptr(ndr, r->in.printer));
+       if (r->in.printer) {
+               NDR_CHECK(ndr_push_unistr(ndr, r->in.printer));
+       }
+       NDR_CHECK(ndr_push_ptr(ndr, r->in.buffer));
+       if (r->in.buffer) {
+               NDR_CHECK(ndr_push_DATA_BLOB(ndr, *r->in.buffer));
+       }
+       NDR_CHECK(ndr_push_uint32(ndr, r->in.access_mask));
 
        return NT_STATUS_OK;
 }
@@ -1249,9 +1262,10 @@ NTSTATUS ndr_pull_spoolss_EnumPrinters(struct ndr_pull *ndr, struct spoolss_Enum
        return NT_STATUS_OK;
 }
 
-NTSTATUS ndr_pull_spoolss_01(struct ndr_pull *ndr, struct spoolss_01 *r)
+NTSTATUS ndr_pull_spoolss_OpenPrinter(struct ndr_pull *ndr, struct spoolss_OpenPrinter *r)
 {
-       NDR_CHECK(ndr_pull_NTSTATUS(ndr, &r->out.result));
+       NDR_CHECK(ndr_pull_policy_handle(ndr, r->out.handle));
+       NDR_CHECK(ndr_pull_WERROR(ndr, &r->out.result));
 
        return NT_STATUS_OK;
 }
index 61aeed9b54c7773b6774bade21987a17999f5532..60738b494ae47893a4455d7c09aec4efd7952678 100644 (file)
@@ -124,12 +124,17 @@ struct spoolss_EnumPrinters {
 
 };
 
-struct spoolss_01 {
+struct spoolss_OpenPrinter {
        struct {
+               const char *server;
+               const char *printer;
+               DATA_BLOB *buffer;
+               uint32 access_mask;
        } in;
 
        struct {
-               NTSTATUS result;
+               struct policy_handle *handle;
+               WERROR result;
        } out;
 
 };
@@ -1135,7 +1140,7 @@ struct spoolss_5f {
 };
 
 #define DCERPC_SPOOLSS_ENUMPRINTERS 0
-#define DCERPC_SPOOLSS_01 1
+#define DCERPC_SPOOLSS_OPENPRINTER 1
 #define DCERPC_SPOOLSS_02 2
 #define DCERPC_SPOOLSS_03 3
 #define DCERPC_SPOOLSS_ENUMJOBS 4
index 6e6436887b9aab07a7beeeb4a76ff6436d99e497..aa8b8520f399a61275b24abf43711eb3dd993087 100644 (file)
@@ -814,3 +814,10 @@ failed:
 }
 
 
+/*
+  a useful function for retrieving the server name we connected to
+*/
+const char *dcerpc_server_name(struct dcerpc_pipe *p)
+{
+       return p->tree->session->transport->called.name;
+}
index 366072c42c4f0de561de628ab641eb758f54b664..e2d3a1ae358ff5a18540085ac15acd0c68d2d12a 100644 (file)
@@ -11,18 +11,12 @@ NTSTATUS dcerpc_spoolss_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                                  r);
 }
 
-NTSTATUS dcerpc_spoolss_01(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct spoolss_01 *r)
+NTSTATUS dcerpc_spoolss_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct spoolss_OpenPrinter *r)
 {
-       NTSTATUS status;
-       status = dcerpc_ndr_request(p, DCERPC_SPOOLSS_01, mem_ctx,
-                                   (ndr_push_fn_t) ndr_push_spoolss_01,
-                                   (ndr_pull_fn_t) ndr_pull_spoolss_01,
-                                   r);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
-       
-       return r->out.result;
+       return dcerpc_ndr_request(p, DCERPC_SPOOLSS_OPENPRINTER, mem_ctx,
+                                 (ndr_push_fn_t) ndr_push_spoolss_OpenPrinter,
+                                 (ndr_pull_fn_t) ndr_pull_spoolss_OpenPrinter,
+                                 r);
 }
 
 NTSTATUS dcerpc_spoolss_02(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct spoolss_02 *r)
index 13e2b2642fa1bb834868e98d559860ce2a7b57a5..0f104491b609afd7b6510a5078c90802065e8939 100644 (file)
 
 #include "includes.h"
 
+static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+                            struct spoolss_PrinterInfo1 *info1)
+{
+       NTSTATUS status;
+       struct spoolss_OpenPrinter r;
+       struct policy_handle handle;
+       DATA_BLOB blob;
+
+       blob = data_blob(NULL, 0);
+
+       r.in.server = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
+       r.in.printer = info1->name;
+       r.in.buffer = &blob;
+       r.in.access_mask = SEC_RIGHT_MAXIMUM_ALLOWED;   
+       r.out.handle = &handle;
+
+       printf("Testing OpenPrinter(\\\\%s\\%s)\n", r.in.server, r.in.printer);
+
+       status = dcerpc_spoolss_OpenPrinter(p, mem_ctx, &r);
+       if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(r.out.result)) {
+               printf("OpenPrinter failed - %s/%s\n", 
+                      nt_errstr(status), win_errstr(r.out.result));
+               return False;
+       }
+
+       
+       return True;
+}
+
 static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
 {
        struct spoolss_EnumPrinters r;
@@ -74,6 +103,13 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
                        printf("Printer %d\n", j);
                        NDR_PRINT_UNION_DEBUG(spoolss_PrinterEnum, r.in.level, &info[j]);
                }
+
+               for (j=0;j<r.out.count;j++) {
+                       if (r.in.level == 1 &&
+                           !test_OpenPrinter(p, mem_ctx, &info[j].info1)) {
+                               ret = False;
+                       }
+               }
        }
        
        return ret;