Ignore:
Timestamp:
Nov 14, 2012, 12:59:34 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to 3.6.0

Location:
vendor/current/source4/librpc
Files:
9 added
5 deleted
23 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source4/librpc/dcerpc.pc.in

    r414 r740  
    77Description: DCE/RPC client library
    88Requires: ndr
    9 Version: 0.0.1
    10 Libs: -L${libdir} -ldcerpc
     9Version: @PACKAGE_VERSION@
     10Libs: @LIB_RPATH@ -L${libdir} -ldcerpc
    1111Cflags: -I${includedir} -DHAVE_IMMEDIATE_STRUCTURES=1
  • vendor/current/source4/librpc/dcerpc_atsvc.pc.in

    r414 r740  
    77Description: DCE/RPC client library - ATSVC
    88Requires.private: dcerpc ndr
    9 Version: 0.0.1
    10 Libs: -L${libdir} -ldcerpc_atsvc
     9Version: @PACKAGE_VERSION@
     10Libs: @LIB_RPATH@ -L${libdir} -ldcerpc-atsvc
    1111Cflags: -I${includedir}  -DHAVE_IMMEDIATE_STRUCTURES=1
  • vendor/current/source4/librpc/dcerpc_samr.pc.in

    r414 r740  
    77Description: DCE/RPC client library - SAMR
    88Requires.private: dcerpc ndr
    9 Version: 0.0.1
    10 Libs: -L${libdir} -ldcerpc_samr
     9Version: @PACKAGE_VERSION@
     10Libs: @LIB_RPATH@ -L${libdir} -ldcerpc-samr
    1111Cflags: -I${includedir}  -DHAVE_IMMEDIATE_STRUCTURES=1
  • vendor/current/source4/librpc/idl/irpc.idl

    r414 r740  
    11#include "idl_types.h"
    22
    3 import "misc.idl", "security.idl", "nbt.idl";
     3import "misc.idl", "security.idl", "nbt.idl", "netlogon.idl";
    44
    55/*
     
    1515        } irpc_flags;
    1616
     17        typedef struct {
     18                security_token *token;
     19        } irpc_creds;
     20
    1721        typedef [public] struct {
    1822                GUID uuid;
     
    2226                irpc_flags flags;
    2327                NTSTATUS status;
     28                [subcontext(4)] irpc_creds creds;
     29                [flag(NDR_ALIGN8)] DATA_BLOB _pad;
    2430        } irpc_header;
    2531
     
    149155                );
    150156
     157        /******************************************************
     158         management calls for the drepl server
     159        ******************************************************/
     160        /**
     161         * Force dreplsrv to fefresh internal cache.
     162         * @param partition_dn Partition to refresh cacheh for.
     163         *                     If empy/NULL, refresh all partitions.
     164         */
     165        WERROR dreplsrv_refresh();
     166
     167        /*
     168          called when role transfer is requested via LDAP
     169        */
     170        typedef [v1_enum] enum {
     171               DREPL_SCHEMA_MASTER,
     172               DREPL_RID_MASTER,
     173               DREPL_INFRASTRUCTURE_MASTER,
     174               DREPL_NAMING_MASTER,
     175               DREPL_PDC_MASTER
     176        } drepl_role_master;
     177
     178        WERROR drepl_takeFSMORole(
     179                [in] drepl_role_master role
     180                );
     181
     182        /*
     183         * message to tell the drepl server to initiate a REPL_SECRET
     184         * replication of a users secrets
     185         */
     186        void drepl_trigger_repl_secret(
     187                [in] astring user_dn
     188                );
     189
     190        /*
     191          message to do RODC DNS updates via the dnsupdate task
     192        */
     193        NTSTATUS dnsupdate_RODC(
     194                [in,unique] dom_sid *dom_sid,
     195                [in,unique] [string,charset(UTF16)] uint16 *site_name,
     196                [in] uint32 dns_ttl,
     197                [in,out,ref] NL_DNS_NAME_INFO_ARRAY *dns_names
     198                );
    151199}
  • vendor/current/source4/librpc/idl/opendb.idl

    r414 r740  
    88*/
    99
    10 import "server_id.idl";
     10import "server_id4.idl";
    1111
    1212[
  • vendor/current/source4/librpc/idl/winbind.idl

    r414 r740  
    55#include "idl_types.h"
    66
    7 import "netlogon.idl", "lsa.idl", "security.idl";
     7import "netlogon.idl", "lsa.idl", "security.idl", "idmap.idl";
    88
    99[
     
    1616        typedef [switch_type(uint16)] union netr_LogonLevel netr_LogonLevel;
    1717        typedef [switch_type(uint16)] union netr_Validation netr_Validation;
    18 
    19         typedef enum {
    20                 ID_TYPE_NOT_SPECIFIED,
    21                 ID_TYPE_UID,
    22                 ID_TYPE_GID,
    23                 ID_TYPE_BOTH
    24         } id_type;
    25 
    26         typedef struct {
    27                 uint32 id;
    28                 id_type type;
    29         } unixid;
    30 
    31         typedef struct {
    32                 unixid *unixid;
    33                 dom_sid *sid;
    34                 NTSTATUS status;
    35         } id_mapping;
    3618
    3719        /* a call to get runtime informations */
     
    6345                [in]     winbind_get_idmap_level level,
    6446                [in]     uint32 count,
    65                 [in,out] [size_is(count)] id_mapping ids[]
     47                [in,out] [size_is(count)] id_map ids[]
    6648        );
    6749
     50        NTSTATUS winbind_DsrUpdateReadOnlyServerDnsRecords(
     51                [in,unique] [string,charset(UTF16)] uint16 *site_name,
     52                [in] uint32 dns_ttl,
     53                [in,out,ref] NL_DNS_NAME_INFO_ARRAY *dns_names
     54                );
    6855}
  • vendor/current/source4/librpc/idl/winsrepl.idl

    r414 r740  
    1212import "nbt.idl";
    1313
    14 interface wrepl
     14[
     15        uuid("915f5653-bac1-431c-97ee-9ffb34526921"),
     16        helpstring("WINS Replication PDUs")
     17] interface wrepl
    1518{
    1619        const int WINS_REPLICATION_PORT = 42;
     
    165168
    166169        typedef [flag(NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
    167                 [value(ndr_size_wrepl_packet(&packet, ndr->iconv_convenience, ndr->flags))] uint32 size;
     170                [value(ndr_size_wrepl_packet(&packet, ndr->flags))] uint32 size;
    168171                wrepl_packet    packet;
    169172        } wrepl_wrap;
  • vendor/current/source4/librpc/ndr/py_misc.c

    r414 r740  
    6262static int py_GUID_init(PyObject *self, PyObject *args, PyObject *kwargs)
    6363{
    64         char *str = NULL;
     64        PyObject *str = NULL;
    6565        NTSTATUS status;
    6666        struct GUID *guid = py_talloc_get_ptr(self);
    6767        const char *kwnames[] = { "str", NULL };
    6868
    69         if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", discard_const_p(char *, kwnames), &str))
     69        if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O", discard_const_p(char *, kwnames), &str))
    7070                return -1;
    7171
    7272        if (str != NULL) {
    73                 status = GUID_from_string(str, guid);
     73                DATA_BLOB guid_val;
     74
     75                if (!PyString_Check(str)) {
     76                        PyErr_SetString(PyExc_TypeError, "Expected a string argument to GUID()");
     77                        return -1;
     78                }
     79                guid_val.data = (uint8_t *)PyString_AsString(str);
     80                guid_val.length = PyString_Size(str);
     81                status = GUID_from_data_blob(&guid_val, guid);
    7482                if (!NT_STATUS_IS_OK(status)) {
    7583                        PyErr_SetNTSTATUS(status);
  • vendor/current/source4/librpc/ndr/py_security.c

    r414 r740  
    4242}
    4343
     44static PyObject *py_dom_sid_split(PyObject *py_self, PyObject *args)
     45{
     46        struct dom_sid *self = py_talloc_get_ptr(py_self);
     47        struct dom_sid *domain_sid;
     48        TALLOC_CTX *mem_ctx;
     49        uint32_t rid;
     50        NTSTATUS status;
     51        PyObject *py_domain_sid;
     52
     53        mem_ctx = talloc_new(NULL);
     54        if (mem_ctx == NULL) {
     55                PyErr_NoMemory();
     56                return NULL;
     57        }
     58
     59        status = dom_sid_split_rid(mem_ctx, self, &domain_sid, &rid);
     60        if (!NT_STATUS_IS_OK(status)) {
     61                PyErr_SetString(PyExc_RuntimeError, "dom_sid_split_rid failed");
     62                talloc_free(mem_ctx);
     63                return NULL;
     64        }
     65
     66        py_domain_sid = py_talloc_steal(&dom_sid_Type, domain_sid);
     67        talloc_free(mem_ctx);
     68        return Py_BuildValue("(OI)", py_domain_sid, rid);
     69}
     70
    4471static int py_dom_sid_cmp(PyObject *py_self, PyObject *py_other)
    4572{
     
    87114}
    88115
     116static PyMethodDef py_dom_sid_extra_methods[] = {
     117        { "split", (PyCFunction)py_dom_sid_split, METH_NOARGS,
     118                "S.split() -> (domain_sid, rid)\n"
     119                "Split a domain sid" },
     120        { NULL }
     121};
     122
     123
    89124static void py_dom_sid_patch(PyTypeObject *type)
    90125{
     
    93128        type->tp_repr = py_dom_sid_repr;
    94129        type->tp_compare = py_dom_sid_cmp;
     130        PyType_AddMethods(type, py_dom_sid_extra_methods);
    95131}
    96132
  • vendor/current/source4/librpc/rpc/dcerpc.c

    r414 r740  
    3131#include "auth/gensec/gensec.h"
    3232#include "param/param.h"
     33#include "lib/util/tevent_ntstatus.h"
     34#include "librpc/rpc/rpc_common.h"
     35
     36enum rpc_request_state {
     37        RPC_REQUEST_QUEUED,
     38        RPC_REQUEST_PENDING,
     39        RPC_REQUEST_DONE
     40};
     41
     42/*
     43  handle for an async dcerpc request
     44*/
     45struct rpc_request {
     46        struct rpc_request *next, *prev;
     47        struct dcerpc_pipe *p;
     48        NTSTATUS status;
     49        uint32_t call_id;
     50        enum rpc_request_state state;
     51        DATA_BLOB payload;
     52        uint32_t flags;
     53        uint32_t fault_code;
     54
     55        /* this is used to distinguish bind and alter_context requests
     56           from normal requests */
     57        void (*recv_handler)(struct rpc_request *conn,
     58                             DATA_BLOB *blob, struct ncacn_packet *pkt);
     59
     60        const struct GUID *object;
     61        uint16_t opnum;
     62        DATA_BLOB request_data;
     63        bool ignore_timeout;
     64
     65        /* use by the ndr level async recv call */
     66        struct {
     67                const struct ndr_interface_table *table;
     68                uint32_t opnum;
     69                void *struct_ptr;
     70                TALLOC_CTX *mem_ctx;
     71        } ndr;
     72
     73        struct {
     74                void (*callback)(struct rpc_request *);
     75                void *private_data;
     76        } async;
     77};
    3378
    3479_PUBLIC_ NTSTATUS dcerpc_init(struct loadparm_context *lp_ctx)
     
    3782}
    3883
    39 static void dcerpc_connection_dead(struct dcerpc_connection *conn, NTSTATUS status);
    40 static void dcerpc_ship_next_request(struct dcerpc_connection *c);
     84static void dcerpc_connection_dead(struct dcecli_connection *conn, NTSTATUS status);
     85static void dcerpc_ship_next_request(struct dcecli_connection *c);
     86
     87static struct rpc_request *dcerpc_request_send(struct dcerpc_pipe *p,
     88                                               const struct GUID *object,
     89                                               uint16_t opnum,
     90                                               DATA_BLOB *stub_data);
     91static NTSTATUS dcerpc_request_recv(struct rpc_request *req,
     92                                    TALLOC_CTX *mem_ctx,
     93                                    DATA_BLOB *stub_data);
     94static NTSTATUS dcerpc_ndr_validate_in(struct dcecli_connection *c,
     95                                       TALLOC_CTX *mem_ctx,
     96                                       DATA_BLOB blob,
     97                                       size_t struct_size,
     98                                       ndr_push_flags_fn_t ndr_push,
     99                                       ndr_pull_flags_fn_t ndr_pull);
     100static NTSTATUS dcerpc_ndr_validate_out(struct dcecli_connection *c,
     101                                        struct ndr_pull *pull_in,
     102                                        void *struct_ptr,
     103                                        size_t struct_size,
     104                                        ndr_push_flags_fn_t ndr_push,
     105                                        ndr_pull_flags_fn_t ndr_pull,
     106                                        ndr_print_function_t ndr_print);
    41107
    42108/* destroy a dcerpc connection */
    43 static int dcerpc_connection_destructor(struct dcerpc_connection *conn)
     109static int dcerpc_connection_destructor(struct dcecli_connection *conn)
    44110{
    45111        if (conn->dead) {
     
    55121   the event context is optional
    56122*/
    57 static struct dcerpc_connection *dcerpc_connection_init(TALLOC_CTX *mem_ctx,
    58                                                  struct tevent_context *ev,
    59                                                  struct smb_iconv_convenience *ic)
    60 {
    61         struct dcerpc_connection *c;
    62 
    63         c = talloc_zero(mem_ctx, struct dcerpc_connection);
     123static struct dcecli_connection *dcerpc_connection_init(TALLOC_CTX *mem_ctx,
     124                                                 struct tevent_context *ev)
     125{
     126        struct dcecli_connection *c;
     127
     128        c = talloc_zero(mem_ctx, struct dcecli_connection);
    64129        if (!c) {
    65130                return NULL;
    66131        }
    67 
    68         c->iconv_convenience = talloc_reference(c, ic);
    69132
    70133        c->event_ctx = ev;
     
    90153}
    91154
     155struct dcerpc_bh_state {
     156        struct dcerpc_pipe *p;
     157};
     158
     159static bool dcerpc_bh_is_connected(struct dcerpc_binding_handle *h)
     160{
     161        struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
     162                                     struct dcerpc_bh_state);
     163
     164        if (!hs->p) {
     165                return false;
     166        }
     167
     168        return true;
     169}
     170
     171static uint32_t dcerpc_bh_set_timeout(struct dcerpc_binding_handle *h,
     172                                      uint32_t timeout)
     173{
     174        struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
     175                                     struct dcerpc_bh_state);
     176        uint32_t old;
     177
     178        if (!hs->p) {
     179                return DCERPC_REQUEST_TIMEOUT;
     180        }
     181
     182        old = hs->p->request_timeout;
     183        hs->p->request_timeout = timeout;
     184
     185        return old;
     186}
     187
     188struct dcerpc_bh_raw_call_state {
     189        struct dcerpc_binding_handle *h;
     190        DATA_BLOB in_data;
     191        DATA_BLOB out_data;
     192        uint32_t out_flags;
     193};
     194
     195static void dcerpc_bh_raw_call_done(struct rpc_request *subreq);
     196
     197static struct tevent_req *dcerpc_bh_raw_call_send(TALLOC_CTX *mem_ctx,
     198                                                  struct tevent_context *ev,
     199                                                  struct dcerpc_binding_handle *h,
     200                                                  const struct GUID *object,
     201                                                  uint32_t opnum,
     202                                                  uint32_t in_flags,
     203                                                  const uint8_t *in_data,
     204                                                  size_t in_length)
     205{
     206        struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
     207                                     struct dcerpc_bh_state);
     208        struct tevent_req *req;
     209        struct dcerpc_bh_raw_call_state *state;
     210        bool ok;
     211        struct rpc_request *subreq;
     212
     213        req = tevent_req_create(mem_ctx, &state,
     214                                struct dcerpc_bh_raw_call_state);
     215        if (req == NULL) {
     216                return NULL;
     217        }
     218        state->h = h;
     219        state->in_data.data = discard_const_p(uint8_t, in_data);
     220        state->in_data.length = in_length;
     221
     222        ok = dcerpc_bh_is_connected(h);
     223        if (!ok) {
     224                tevent_req_nterror(req, NT_STATUS_INVALID_CONNECTION);
     225                return tevent_req_post(req, ev);
     226        }
     227
     228        subreq = dcerpc_request_send(hs->p,
     229                                     object,
     230                                     opnum,
     231                                     &state->in_data);
     232        if (tevent_req_nomem(subreq, req)) {
     233                return tevent_req_post(req, ev);
     234        }
     235        subreq->async.callback = dcerpc_bh_raw_call_done;
     236        subreq->async.private_data = req;
     237
     238        return req;
     239}
     240
     241static void dcerpc_bh_raw_call_done(struct rpc_request *subreq)
     242{
     243        struct tevent_req *req =
     244                talloc_get_type_abort(subreq->async.private_data,
     245                struct tevent_req);
     246        struct dcerpc_bh_raw_call_state *state =
     247                tevent_req_data(req,
     248                struct dcerpc_bh_raw_call_state);
     249        NTSTATUS status;
     250        uint32_t fault_code;
     251
     252        state->out_flags = 0;
     253        if (subreq->flags & DCERPC_PULL_BIGENDIAN) {
     254                state->out_flags |= LIBNDR_FLAG_BIGENDIAN;
     255        }
     256
     257        fault_code = subreq->fault_code;
     258
     259        status = dcerpc_request_recv(subreq, state, &state->out_data);
     260        if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
     261                status = dcerpc_fault_to_nt_status(fault_code);
     262        }
     263        if (!NT_STATUS_IS_OK(status)) {
     264                tevent_req_nterror(req, status);
     265                return;
     266        }
     267
     268        tevent_req_done(req);
     269}
     270
     271static NTSTATUS dcerpc_bh_raw_call_recv(struct tevent_req *req,
     272                                        TALLOC_CTX *mem_ctx,
     273                                        uint8_t **out_data,
     274                                        size_t *out_length,
     275                                        uint32_t *out_flags)
     276{
     277        struct dcerpc_bh_raw_call_state *state =
     278                tevent_req_data(req,
     279                struct dcerpc_bh_raw_call_state);
     280        NTSTATUS status;
     281
     282        if (tevent_req_is_nterror(req, &status)) {
     283                tevent_req_received(req);
     284                return status;
     285        }
     286
     287        *out_data = talloc_move(mem_ctx, &state->out_data.data);
     288        *out_length = state->out_data.length;
     289        *out_flags = state->out_flags;
     290        tevent_req_received(req);
     291        return NT_STATUS_OK;
     292}
     293
     294struct dcerpc_bh_disconnect_state {
     295        uint8_t _dummy;
     296};
     297
     298static struct tevent_req *dcerpc_bh_disconnect_send(TALLOC_CTX *mem_ctx,
     299                                                struct tevent_context *ev,
     300                                                struct dcerpc_binding_handle *h)
     301{
     302        struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
     303                                     struct dcerpc_bh_state);
     304        struct tevent_req *req;
     305        struct dcerpc_bh_disconnect_state *state;
     306        bool ok;
     307
     308        req = tevent_req_create(mem_ctx, &state,
     309                                struct dcerpc_bh_disconnect_state);
     310        if (req == NULL) {
     311                return NULL;
     312        }
     313
     314        ok = dcerpc_bh_is_connected(h);
     315        if (!ok) {
     316                tevent_req_nterror(req, NT_STATUS_INVALID_CONNECTION);
     317                return tevent_req_post(req, ev);
     318        }
     319
     320        /* TODO: do a real disconnect ... */
     321        hs->p = NULL;
     322
     323        tevent_req_done(req);
     324        return tevent_req_post(req, ev);
     325}
     326
     327static NTSTATUS dcerpc_bh_disconnect_recv(struct tevent_req *req)
     328{
     329        NTSTATUS status;
     330
     331        if (tevent_req_is_nterror(req, &status)) {
     332                tevent_req_received(req);
     333                return status;
     334        }
     335
     336        tevent_req_received(req);
     337        return NT_STATUS_OK;
     338}
     339
     340static bool dcerpc_bh_push_bigendian(struct dcerpc_binding_handle *h)
     341{
     342        struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
     343                                     struct dcerpc_bh_state);
     344
     345        if (hs->p->conn->flags & DCERPC_PUSH_BIGENDIAN) {
     346                return true;
     347        }
     348
     349        return false;
     350}
     351
     352static bool dcerpc_bh_ref_alloc(struct dcerpc_binding_handle *h)
     353{
     354        struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
     355                                     struct dcerpc_bh_state);
     356
     357        if (hs->p->conn->flags & DCERPC_NDR_REF_ALLOC) {
     358                return true;
     359        }
     360
     361        return false;
     362}
     363
     364static bool dcerpc_bh_use_ndr64(struct dcerpc_binding_handle *h)
     365{
     366        struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
     367                                     struct dcerpc_bh_state);
     368
     369        if (hs->p->conn->flags & DCERPC_NDR64) {
     370                return true;
     371        }
     372
     373        return false;
     374}
     375
     376static void dcerpc_bh_do_ndr_print(struct dcerpc_binding_handle *h,
     377                                   int ndr_flags,
     378                                   const void *_struct_ptr,
     379                                   const struct ndr_interface_call *call)
     380{
     381        struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
     382                                     struct dcerpc_bh_state);
     383        void *struct_ptr = discard_const(_struct_ptr);
     384
     385        if (ndr_flags & NDR_IN) {
     386                if (hs->p->conn->flags & DCERPC_DEBUG_PRINT_IN) {
     387                        ndr_print_function_debug(call->ndr_print,
     388                                                 call->name,
     389                                                 ndr_flags,
     390                                                 struct_ptr);
     391                }
     392        }
     393        if (ndr_flags & NDR_OUT) {
     394                if (hs->p->conn->flags & DCERPC_DEBUG_PRINT_OUT) {
     395                        ndr_print_function_debug(call->ndr_print,
     396                                                 call->name,
     397                                                 ndr_flags,
     398                                                 struct_ptr);
     399                }
     400        }
     401}
     402
     403static void dcerpc_bh_ndr_push_failed(struct dcerpc_binding_handle *h,
     404                                      NTSTATUS error,
     405                                      const void *struct_ptr,
     406                                      const struct ndr_interface_call *call)
     407{
     408        DEBUG(2,("Unable to ndr_push structure for %s - %s\n",
     409                 call->name, nt_errstr(error)));
     410}
     411
     412static void dcerpc_bh_ndr_pull_failed(struct dcerpc_binding_handle *h,
     413                                      NTSTATUS error,
     414                                      const DATA_BLOB *blob,
     415                                      const struct ndr_interface_call *call)
     416{
     417        struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
     418                                     struct dcerpc_bh_state);
     419        const uint32_t num_examples = 20;
     420        uint32_t i;
     421
     422        DEBUG(2,("Unable to ndr_pull structure for %s - %s\n",
     423                 call->name, nt_errstr(error)));
     424
     425        if (hs->p->conn->packet_log_dir == NULL) return;
     426
     427        for (i=0;i<num_examples;i++) {
     428                char *name=NULL;
     429                asprintf(&name, "%s/rpclog/%s-out.%d",
     430                         hs->p->conn->packet_log_dir,
     431                         call->name, i);
     432                if (name == NULL) {
     433                        return;
     434                }
     435                if (!file_exist(name)) {
     436                        if (file_save(name, blob->data, blob->length)) {
     437                                DEBUG(10,("Logged rpc packet to %s\n", name));
     438                        }
     439                        free(name);
     440                        break;
     441                }
     442                free(name);
     443        }
     444}
     445
     446static NTSTATUS dcerpc_bh_ndr_validate_in(struct dcerpc_binding_handle *h,
     447                                          TALLOC_CTX *mem_ctx,
     448                                          const DATA_BLOB *blob,
     449                                          const struct ndr_interface_call *call)
     450{
     451        struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
     452                                     struct dcerpc_bh_state);
     453
     454        if (hs->p->conn->flags & DCERPC_DEBUG_VALIDATE_IN) {
     455                NTSTATUS status;
     456
     457                status = dcerpc_ndr_validate_in(hs->p->conn,
     458                                                mem_ctx,
     459                                                *blob,
     460                                                call->struct_size,
     461                                                call->ndr_push,
     462                                                call->ndr_pull);
     463                if (!NT_STATUS_IS_OK(status)) {
     464                        DEBUG(0,("Validation [in] failed for %s - %s\n",
     465                                 call->name, nt_errstr(status)));
     466                        return status;
     467                }
     468        }
     469
     470        DEBUG(10,("rpc request data:\n"));
     471        dump_data(10, blob->data, blob->length);
     472
     473        return NT_STATUS_OK;
     474}
     475
     476static NTSTATUS dcerpc_bh_ndr_validate_out(struct dcerpc_binding_handle *h,
     477                                           struct ndr_pull *pull_in,
     478                                           const void *_struct_ptr,
     479                                           const struct ndr_interface_call *call)
     480{
     481        struct dcerpc_bh_state *hs = dcerpc_binding_handle_data(h,
     482                                     struct dcerpc_bh_state);
     483        void *struct_ptr = discard_const(_struct_ptr);
     484
     485        DEBUG(10,("rpc reply data:\n"));
     486        dump_data(10, pull_in->data, pull_in->data_size);
     487
     488        if (pull_in->offset != pull_in->data_size) {
     489                DEBUG(0,("Warning! ignoring %u unread bytes at ofs:%u (0x%08X) for %s!\n",
     490                         pull_in->data_size - pull_in->offset,
     491                         pull_in->offset, pull_in->offset,
     492                         call->name));
     493                /* we used to return NT_STATUS_INFO_LENGTH_MISMATCH here,
     494                   but it turns out that early versions of NT
     495                   (specifically NT3.1) add junk onto the end of rpc
     496                   packets, so if we want to interoperate at all with
     497                   those versions then we need to ignore this error */
     498        }
     499
     500        if (hs->p->conn->flags & DCERPC_DEBUG_VALIDATE_OUT) {
     501                NTSTATUS status;
     502
     503                status = dcerpc_ndr_validate_out(hs->p->conn,
     504                                                 pull_in,
     505                                                 struct_ptr,
     506                                                 call->struct_size,
     507                                                 call->ndr_push,
     508                                                 call->ndr_pull,
     509                                                 call->ndr_print);
     510                if (!NT_STATUS_IS_OK(status)) {
     511                        DEBUG(2,("Validation [out] failed for %s - %s\n",
     512                                 call->name, nt_errstr(status)));
     513                        return status;
     514                }
     515        }
     516
     517        return NT_STATUS_OK;
     518}
     519
     520static const struct dcerpc_binding_handle_ops dcerpc_bh_ops = {
     521        .name                   = "dcerpc",
     522        .is_connected           = dcerpc_bh_is_connected,
     523        .set_timeout            = dcerpc_bh_set_timeout,
     524        .raw_call_send          = dcerpc_bh_raw_call_send,
     525        .raw_call_recv          = dcerpc_bh_raw_call_recv,
     526        .disconnect_send        = dcerpc_bh_disconnect_send,
     527        .disconnect_recv        = dcerpc_bh_disconnect_recv,
     528
     529        .push_bigendian         = dcerpc_bh_push_bigendian,
     530        .ref_alloc              = dcerpc_bh_ref_alloc,
     531        .use_ndr64              = dcerpc_bh_use_ndr64,
     532        .do_ndr_print           = dcerpc_bh_do_ndr_print,
     533        .ndr_push_failed        = dcerpc_bh_ndr_push_failed,
     534        .ndr_pull_failed        = dcerpc_bh_ndr_pull_failed,
     535        .ndr_validate_in        = dcerpc_bh_ndr_validate_in,
     536        .ndr_validate_out       = dcerpc_bh_ndr_validate_out,
     537};
     538
    92539/* initialise a dcerpc pipe. */
    93 _PUBLIC_ struct dcerpc_pipe *dcerpc_pipe_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
    94                                      struct smb_iconv_convenience *ic)
     540struct dcerpc_binding_handle *dcerpc_pipe_binding_handle(struct dcerpc_pipe *p)
     541{
     542        struct dcerpc_binding_handle *h;
     543        struct dcerpc_bh_state *hs;
     544
     545        h = dcerpc_binding_handle_create(p,
     546                                         &dcerpc_bh_ops,
     547                                         NULL,
     548                                         NULL, /* TODO */
     549                                         &hs,
     550                                         struct dcerpc_bh_state,
     551                                         __location__);
     552        if (h == NULL) {
     553                return NULL;
     554        }
     555        hs->p = p;
     556
     557        dcerpc_binding_handle_set_sync_ev(h, p->conn->event_ctx);
     558
     559        return h;
     560}
     561
     562/* initialise a dcerpc pipe. */
     563_PUBLIC_ struct dcerpc_pipe *dcerpc_pipe_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev)
    95564{
    96565        struct dcerpc_pipe *p;
    97566
    98         p = talloc(mem_ctx, struct dcerpc_pipe);
     567        p = talloc_zero(mem_ctx, struct dcerpc_pipe);
    99568        if (!p) {
    100569                return NULL;
    101570        }
    102571
    103         p->conn = dcerpc_connection_init(p, ev, ic);
     572        p->conn = dcerpc_connection_init(p, ev);
    104573        if (p->conn == NULL) {
    105574                talloc_free(p);
     
    119588        }
    120589
     590        p->binding_handle = dcerpc_pipe_binding_handle(p);
     591        if (p->binding_handle == NULL) {
     592                talloc_free(p);
     593                return NULL;
     594        }
     595
    121596        return p;
    122597}
     
    126601   choose the next call id to use
    127602*/
    128 static uint32_t next_call_id(struct dcerpc_connection *c)
     603static uint32_t next_call_id(struct dcecli_connection *c)
    129604{
    130605        c->call_id++;
     
    135610}
    136611
    137 /* we need to be able to get/set the fragment length without doing a full
    138    decode */
    139 void dcerpc_set_frag_length(DATA_BLOB *blob, uint16_t v)
    140 {
    141         if (CVAL(blob->data,DCERPC_DREP_OFFSET) & DCERPC_DREP_LE) {
    142                 SSVAL(blob->data, DCERPC_FRAG_LEN_OFFSET, v);
    143         } else {
    144                 RSSVAL(blob->data, DCERPC_FRAG_LEN_OFFSET, v);
    145         }
    146 }
    147 
    148 uint16_t dcerpc_get_frag_length(const DATA_BLOB *blob)
    149 {
    150         if (CVAL(blob->data,DCERPC_DREP_OFFSET) & DCERPC_DREP_LE) {
    151                 return SVAL(blob->data, DCERPC_FRAG_LEN_OFFSET);
    152         } else {
    153                 return RSVAL(blob->data, DCERPC_FRAG_LEN_OFFSET);
    154         }
    155 }
    156 
    157 void dcerpc_set_auth_length(DATA_BLOB *blob, uint16_t v)
    158 {
    159         if (CVAL(blob->data,DCERPC_DREP_OFFSET) & DCERPC_DREP_LE) {
    160                 SSVAL(blob->data, DCERPC_AUTH_LEN_OFFSET, v);
    161         } else {
    162                 RSSVAL(blob->data, DCERPC_AUTH_LEN_OFFSET, v);
    163         }
    164 }
    165 
    166 
    167612/**
    168613  setup for a ndr pull, also setting up any flags from the binding string
    169614*/
    170 static struct ndr_pull *ndr_pull_init_flags(struct dcerpc_connection *c,
     615static struct ndr_pull *ndr_pull_init_flags(struct dcecli_connection *c,
    171616                                            DATA_BLOB *blob, TALLOC_CTX *mem_ctx)
    172617{
    173         struct ndr_pull *ndr = ndr_pull_init_blob(blob, mem_ctx, c->iconv_convenience);
     618        struct ndr_pull *ndr = ndr_pull_init_blob(blob, mem_ctx);
    174619
    175620        if (ndr == NULL) return ndr;
     
    194639   input and output packets
    195640*/
    196 static NTSTATUS ncacn_pull(struct dcerpc_connection *c, DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
     641static NTSTATUS ncacn_pull(struct dcecli_connection *c, DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
    197642                            struct ncacn_packet *pkt)
    198643{
     
    220665   parse the authentication information on a dcerpc response packet
    221666*/
    222 static NTSTATUS ncacn_pull_request_auth(struct dcerpc_connection *c, TALLOC_CTX *mem_ctx,
     667static NTSTATUS ncacn_pull_request_auth(struct dcecli_connection *c, TALLOC_CTX *mem_ctx,
    223668                                        DATA_BLOB *raw_packet,
    224669                                        struct ncacn_packet *pkt)
    225670{
    226         struct ndr_pull *ndr;
    227671        NTSTATUS status;
    228672        struct dcerpc_auth auth;
    229         DATA_BLOB auth_blob;
    230         enum ndr_err_code ndr_err;
     673        uint32_t auth_length;
    231674
    232675        if (!c->security_state.auth_info ||
     
    255698        }
    256699
    257         auth_blob.length = 8 + pkt->auth_length;
    258 
    259         /* check for a valid length */
    260         if (pkt->u.response.stub_and_verifier.length < auth_blob.length) {
    261                 return NT_STATUS_INFO_LENGTH_MISMATCH;
    262         }
    263 
    264         auth_blob.data =
    265                 pkt->u.response.stub_and_verifier.data +
    266                 pkt->u.response.stub_and_verifier.length - auth_blob.length;
    267         pkt->u.response.stub_and_verifier.length -= auth_blob.length;
    268 
    269         /* pull the auth structure */
    270         ndr = ndr_pull_init_flags(c, &auth_blob, mem_ctx);
    271         if (!ndr) {
    272                 return NT_STATUS_NO_MEMORY;
    273         }
    274 
    275         if (!(pkt->drep[0] & DCERPC_DREP_LE)) {
    276                 ndr->flags |= LIBNDR_FLAG_BIGENDIAN;
    277         }
    278 
    279         ndr_err = ndr_pull_dcerpc_auth(ndr, NDR_SCALARS|NDR_BUFFERS, &auth);
    280         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    281                 return ndr_map_error2ntstatus(ndr_err);
    282         }
    283         status = NT_STATUS_OK;
     700        status = dcerpc_pull_auth_trailer(pkt, mem_ctx,
     701                                          &pkt->u.response.stub_and_verifier,
     702                                          &auth, &auth_length, false);
     703        NT_STATUS_NOT_OK_RETURN(status);
     704
     705        pkt->u.response.stub_and_verifier.length -= auth_length;
    284706
    285707        /* check signature or unseal the packet */
     
    318740        }
    319741       
    320         /* remove the indicated amount of paddiing */
     742        /* remove the indicated amount of padding */
    321743        if (pkt->u.response.stub_and_verifier.length < auth.auth_pad_length) {
    322744                return NT_STATUS_INFO_LENGTH_MISMATCH;
     
    331753   push a dcerpc request packet into a blob, possibly signing it.
    332754*/
    333 static NTSTATUS ncacn_push_request_sign(struct dcerpc_connection *c,
     755static NTSTATUS ncacn_push_request_sign(struct dcecli_connection *c,
    334756                                         DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
    335757                                         size_t sig_size,
     
    345767        /* non-signed packets are simpler */
    346768        if (sig_size == 0) {
    347                 return ncacn_push_auth(blob, mem_ctx, c->iconv_convenience, pkt, NULL);
     769                return ncacn_push_auth(blob, mem_ctx, pkt, NULL);
    348770        }
    349771
     
    355777        case DCERPC_AUTH_LEVEL_CONNECT:
    356778                /* TODO: let the gensec mech decide if it wants to generate a signature */
    357                 return ncacn_push_auth(blob, mem_ctx, c->iconv_convenience, pkt, NULL);
     779                return ncacn_push_auth(blob, mem_ctx, pkt, NULL);
    358780
    359781        case DCERPC_AUTH_LEVEL_NONE:
    360                 return ncacn_push_auth(blob, mem_ctx, c->iconv_convenience, pkt, NULL);
     782                return ncacn_push_auth(blob, mem_ctx, pkt, NULL);
    361783
    362784        default:
     
    364786        }
    365787
    366         ndr = ndr_push_init_ctx(mem_ctx, c->iconv_convenience);
     788        ndr = ndr_push_init_ctx(mem_ctx);
    367789        if (!ndr) {
    368790                return NT_STATUS_NO_MEMORY;
     
    386808                return ndr_map_error2ntstatus(ndr_err);
    387809        }
    388         status = NT_STATUS_OK;
    389810
    390811        /* pad to 16 byte multiple in the payload portion of the
    391            packet. This matches what w2k3 does */
    392         c->security_state.auth_info->auth_pad_length =
     812           packet. This matches what w2k3 does. Note that we can't use
     813           ndr_push_align() as that is relative to the start of the
     814           whole packet, whereas w2k8 wants it relative to the start
     815           of the stub */
     816        c->security_state.auth_info->auth_pad_length =
    393817                (16 - (pkt->u.request.stub_and_verifier.length & 15)) & 15;
    394818        ndr_err = ndr_push_zero(ndr, c->security_state.auth_info->auth_pad_length);
     
    396820                return ndr_map_error2ntstatus(ndr_err);
    397821        }
    398         status = NT_STATUS_OK;
    399822
    400823        payload_length = pkt->u.request.stub_and_verifier.length +
     
    409832                return ndr_map_error2ntstatus(ndr_err);
    410833        }
    411         status = NT_STATUS_OK;
    412834
    413835        /* extract the whole packet as a blob */
     
    457879
    458880        if (creds2.length != sig_size) {
    459                 DEBUG(0,("ncacn_push_request_sign: creds2.length[%u] != sig_size[%u] pad[%u] stub[%u]\n",
    460                         creds2.length, (uint32_t)sig_size,
    461                         c->security_state.auth_info->auth_pad_length,
    462                         pkt->u.request.stub_and_verifier.length));
    463                 return NT_STATUS_INTERNAL_ERROR;
     881                /* this means the sig_size estimate for the signature
     882                   was incorrect. We have to correct the packet
     883                   sizes. That means we could go over the max fragment
     884                   length */
     885                DEBUG(3,("ncacn_push_request_sign: creds2.length[%u] != sig_size[%u] pad[%u] stub[%u]\n",
     886                        (unsigned) creds2.length,
     887                        (unsigned) sig_size,
     888                        (unsigned) c->security_state.auth_info->auth_pad_length,
     889                        (unsigned) pkt->u.request.stub_and_verifier.length));
     890                dcerpc_set_frag_length(blob, blob->length + creds2.length);
     891                dcerpc_set_auth_length(blob, creds2.length);
    464892        }
    465893
     
    475903   fill in the fixed values in a dcerpc header
    476904*/
    477 static void init_ncacn_hdr(struct dcerpc_connection *c, struct ncacn_packet *pkt)
     905static void init_ncacn_hdr(struct dcecli_connection *c, struct ncacn_packet *pkt)
    478906{
    479907        pkt->rpc_vers = 5;
     
    535963  mark the dcerpc connection dead. All outstanding requests get an error
    536964*/
    537 static void dcerpc_connection_dead(struct dcerpc_connection *conn, NTSTATUS status)
     965static void dcerpc_connection_dead(struct dcecli_connection *conn, NTSTATUS status)
    538966{
    539967        if (conn->dead) return;
     
    566994  packets we need to handle
    567995*/
    568 static void dcerpc_request_recv_data(struct dcerpc_connection *c,
     996static void dcerpc_request_recv_data(struct dcecli_connection *c,
    569997                                     DATA_BLOB *raw_packet, struct ncacn_packet *pkt);
    570998
     
    5741002  dispatch to the appropriate handler
    5751003*/
    576 static void dcerpc_recv_data(struct dcerpc_connection *conn, DATA_BLOB *blob, NTSTATUS status)
     1004static void dcerpc_recv_data(struct dcecli_connection *conn, DATA_BLOB *blob, NTSTATUS status)
    5771005{
    5781006        struct ncacn_packet pkt;
     
    6001028}
    6011029
    602 
    6031030/*
    6041031  Receive a bind reply from the transport
     
    6081035{
    6091036        struct composite_context *c;
    610         struct dcerpc_connection *conn;
     1037        struct dcecli_connection *conn;
    6111038
    6121039        c = talloc_get_type(req->async.private_data, struct composite_context);
     
    6231050            (pkt->u.bind_ack.num_results == 0) ||
    6241051            (pkt->u.bind_ack.ctx_list[0].result != 0)) {
     1052                req->p->last_fault_code = DCERPC_NCA_S_PROTO_ERROR;
    6251053                composite_error(c, NT_STATUS_NET_WRITE_FAULT);
    6261054                return;
     
    6431071
    6441072        /* the bind_ack might contain a reply set of credentials */
    645         if (conn->security_state.auth_info &&
    646             pkt->u.bind_ack.auth_info.length) {
    647                 enum ndr_err_code ndr_err;
    648                 ndr_err = ndr_pull_struct_blob(
    649                         &pkt->u.bind_ack.auth_info, conn,
    650                         NULL,
    651                         conn->security_state.auth_info,
    652                         (ndr_pull_flags_fn_t)ndr_pull_dcerpc_auth);
    653                 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    654                         c->status = ndr_map_error2ntstatus(ndr_err);
    655                         if (!composite_is_ok(c)) return;
     1073        if (conn->security_state.auth_info && pkt->u.bind_ack.auth_info.length) {
     1074                NTSTATUS status;
     1075                uint32_t auth_length;
     1076                status = dcerpc_pull_auth_trailer(pkt, conn, &pkt->u.bind_ack.auth_info,
     1077                                                  conn->security_state.auth_info, &auth_length, true);
     1078                if (!NT_STATUS_IS_OK(status)) {
     1079                        composite_error(c, status);
     1080                        return;
    6561081                }
    6571082        }
     
    7321157
    7331158        /* construct the NDR form of the packet */
    734         c->status = ncacn_push_auth(&blob, c, p->conn->iconv_convenience, &pkt,
     1159        c->status = ncacn_push_auth(&blob, c, &pkt,
    7351160                                    p->conn->security_state.auth_info);
    7361161        if (!composite_is_ok(c)) return c;
     
    7911216        pkt.call_id = next_call_id(p->conn);
    7921217        pkt.auth_length = 0;
    793         pkt.u.auth3._pad = 0;
    7941218        pkt.u.auth3.auth_info = data_blob(NULL, 0);
    7951219
     
    8041228        /* construct the NDR form of the packet */
    8051229        status = ncacn_push_auth(&blob, mem_ctx,
    806                                  p->conn->iconv_convenience,
    8071230                                 &pkt,
    8081231                                 p->conn->security_state.auth_info);
     
    8271250  This function frees the data
    8281251*/
    829 static void dcerpc_request_recv_data(struct dcerpc_connection *c,
     1252static void dcerpc_request_recv_data(struct dcecli_connection *c,
    8301253                                     DATA_BLOB *raw_packet, struct ncacn_packet *pkt)
    8311254{
    8321255        struct rpc_request *req;
    833         uint_t length;
     1256        unsigned int length;
    8341257        NTSTATUS status = NT_STATUS_OK;
    8351258
     
    9471370                                               const struct GUID *object,
    9481371                                               uint16_t opnum,
    949                                                bool async,
    9501372                                               DATA_BLOB *stub_data)
    9511373{
     
    9661388        req->flags = 0;
    9671389        req->fault_code = 0;
    968         req->async_call = async;
    9691390        req->ignore_timeout = false;
    9701391        req->async.callback = NULL;
     
    10071428*/
    10081429
    1009 static void dcerpc_ship_next_request(struct dcerpc_connection *c)
     1430static void dcerpc_ship_next_request(struct dcecli_connection *c)
    10101431{
    10111432        struct rpc_request *req;
     
    10171438        bool first_packet = true;
    10181439        size_t sig_size = 0;
     1440        bool need_async = false;
    10191441
    10201442        req = c->request_queue;
     
    10261448        stub_data = &req->request_data;
    10271449
    1028         if (!req->async_call && (c->pending != NULL)) {
    1029                 return;
     1450        if (c->pending) {
     1451                need_async = true;
    10301452        }
    10311453
     
    10641486                pkt.u.request.object.object = *req->object;
    10651487                pkt.pfc_flags |= DCERPC_PFC_FLAG_OBJECT_UUID;
    1066                 chunk_size -= ndr_size_GUID(req->object,NULL,0);
     1488                chunk_size -= ndr_size_GUID(req->object,0);
    10671489        }
    10681490
     
    10951517                }
    10961518
    1097                 if (last_frag && !req->async_call) {
     1519                if (last_frag && !need_async) {
    10981520                        do_trans = true;
    10991521                }
     
    11331555  perform the receive side of a async dcerpc request
    11341556*/
    1135 NTSTATUS dcerpc_request_recv(struct rpc_request *req,
    1136                              TALLOC_CTX *mem_ctx,
    1137                              DATA_BLOB *stub_data)
     1557static NTSTATUS dcerpc_request_recv(struct rpc_request *req,
     1558                                    TALLOC_CTX *mem_ctx,
     1559                                    DATA_BLOB *stub_data)
    11381560{
    11391561        NTSTATUS status;
     
    11581580
    11591581/*
    1160   perform a full request/response pair on a dcerpc pipe
    1161 */
    1162 NTSTATUS dcerpc_request(struct dcerpc_pipe *p,
    1163                         struct GUID *object,
    1164                         uint16_t opnum,
    1165                         TALLOC_CTX *mem_ctx,
    1166                         DATA_BLOB *stub_data_in,
    1167                         DATA_BLOB *stub_data_out)
    1168 {
    1169         struct rpc_request *req;
    1170 
    1171         req = dcerpc_request_send(p, object, opnum, false, stub_data_in);
    1172         if (req == NULL) {
    1173                 return NT_STATUS_NO_MEMORY;
    1174         }
    1175 
    1176         return dcerpc_request_recv(req, mem_ctx, stub_data_out);
    1177 }
    1178 
    1179 
    1180 /*
    11811582  this is a paranoid NDR validator. For every packet we push onto the wire
    11821583  we pull it back again, then push it again. Then we compare the raw NDR data
     
    11841585  we must have a bug in either the pull or push side of our code
    11851586*/
    1186 static NTSTATUS dcerpc_ndr_validate_in(struct dcerpc_connection *c,
     1587static NTSTATUS dcerpc_ndr_validate_in(struct dcecli_connection *c,
    11871588                                       TALLOC_CTX *mem_ctx,
    11881589                                       DATA_BLOB blob,
     
    12071608        }
    12081609        pull->flags |= LIBNDR_FLAG_REF_ALLOC;
     1610
     1611        if (c->flags & DCERPC_PUSH_BIGENDIAN) {
     1612                pull->flags |= LIBNDR_FLAG_BIGENDIAN;
     1613        }
     1614
     1615        if (c->flags & DCERPC_NDR64) {
     1616                pull->flags |= LIBNDR_FLAG_NDR64;
     1617        }
    12091618
    12101619        ndr_err = ndr_pull(pull, NDR_IN, st);
     
    12171626        }
    12181627
    1219         push = ndr_push_init_ctx(mem_ctx, c->iconv_convenience);
     1628        push = ndr_push_init_ctx(mem_ctx);
    12201629        if (!push) {
    12211630                return NT_STATUS_NO_MEMORY;
    12221631        }       
     1632
     1633        if (c->flags & DCERPC_PUSH_BIGENDIAN) {
     1634                push->flags |= LIBNDR_FLAG_BIGENDIAN;
     1635        }
     1636
     1637        if (c->flags & DCERPC_NDR64) {
     1638                push->flags |= LIBNDR_FLAG_NDR64;
     1639        }
    12231640
    12241641        ndr_err = ndr_push(push, NDR_IN, st);
     
    12531670  bug in either the pull or push side of our code
    12541671*/
    1255 static NTSTATUS dcerpc_ndr_validate_out(struct dcerpc_connection *c,
     1672static NTSTATUS dcerpc_ndr_validate_out(struct dcecli_connection *c,
    12561673                                        struct ndr_pull *pull_in,
    12571674                                        void *struct_ptr,
     
    12751692        memcpy(st, struct_ptr, struct_size);
    12761693
    1277         push = ndr_push_init_ctx(mem_ctx, c->iconv_convenience);
     1694        push = ndr_push_init_ctx(mem_ctx);
    12781695        if (!push) {
    12791696                return NT_STATUS_NO_MEMORY;
     
    13061723        }
    13071724
    1308         push = ndr_push_init_ctx(mem_ctx, c->iconv_convenience);
     1725        push = ndr_push_init_ctx(mem_ctx);
    13091726        if (!push) {
    13101727                return NT_STATUS_NO_MEMORY;
     
    13561773}
    13571774
    1358 
    1359 /**
    1360  send a rpc request given a dcerpc_call structure
    1361  */
    1362 struct rpc_request *dcerpc_ndr_request_send(struct dcerpc_pipe *p,
    1363                                             const struct GUID *object,
    1364                                             const struct ndr_interface_table *table,
    1365                                             uint32_t opnum,
    1366                                             bool async,
    1367                                             TALLOC_CTX *mem_ctx,
    1368                                             void *r)
    1369 {
    1370         const struct ndr_interface_call *call;
    1371         struct ndr_push *push;
    1372         NTSTATUS status;
    1373         DATA_BLOB request;
    1374         struct rpc_request *req;
    1375         enum ndr_err_code ndr_err;
    1376 
    1377         call = &table->calls[opnum];
    1378 
    1379         /* setup for a ndr_push_* call */
    1380         push = ndr_push_init_ctx(mem_ctx, p->conn->iconv_convenience);
    1381         if (!push) {
    1382                 return NULL;
    1383         }
    1384 
    1385         if (p->conn->flags & DCERPC_PUSH_BIGENDIAN) {
    1386                 push->flags |= LIBNDR_FLAG_BIGENDIAN;
    1387         }
    1388 
    1389         if (p->conn->flags & DCERPC_NDR64) {
    1390                 push->flags |= LIBNDR_FLAG_NDR64;
    1391         }
    1392 
    1393         /* push the structure into a blob */
    1394         ndr_err = call->ndr_push(push, NDR_IN, r);
    1395         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    1396                 status = ndr_map_error2ntstatus(ndr_err);
    1397                 DEBUG(2,("Unable to ndr_push structure in dcerpc_ndr_request_send - %s\n",
    1398                          nt_errstr(status)));
    1399                 talloc_free(push);
    1400                 return NULL;
    1401         }
    1402 
    1403         /* retrieve the blob */
    1404         request = ndr_push_blob(push);
    1405 
    1406         if (p->conn->flags & DCERPC_DEBUG_VALIDATE_IN) {
    1407                 status = dcerpc_ndr_validate_in(p->conn, push, request, call->struct_size,
    1408                                                 call->ndr_push, call->ndr_pull);
    1409                 if (!NT_STATUS_IS_OK(status)) {
    1410                         DEBUG(2,("Validation failed in dcerpc_ndr_request_send - %s\n",
    1411                                  nt_errstr(status)));
    1412                         talloc_free(push);
    1413                         return NULL;
    1414                 }
    1415         }
    1416 
    1417         DEBUG(10,("rpc request data:\n"));
    1418         dump_data(10, request.data, request.length);
    1419 
    1420         /* make the actual dcerpc request */
    1421         req = dcerpc_request_send(p, object, opnum, async, &request);
    1422 
    1423         if (req != NULL) {
    1424                 req->ndr.table = table;
    1425                 req->ndr.opnum = opnum;
    1426                 req->ndr.struct_ptr = r;
    1427                 req->ndr.mem_ctx = mem_ctx;
    1428         }
    1429 
    1430         talloc_free(push);
    1431 
    1432         return req;
    1433 }
    1434 
    1435 /*
    1436   receive the answer from a dcerpc_ndr_request_send()
    1437 */
    1438 _PUBLIC_ NTSTATUS dcerpc_ndr_request_recv(struct rpc_request *req)
    1439 {
    1440         struct dcerpc_pipe *p = req->p;
    1441         NTSTATUS status;
    1442         DATA_BLOB response;
    1443         struct ndr_pull *pull;
    1444         uint_t flags;
    1445         TALLOC_CTX *mem_ctx = req->ndr.mem_ctx;
    1446         void *r = req->ndr.struct_ptr;
    1447         uint32_t opnum = req->ndr.opnum;
    1448         const struct ndr_interface_table *table = req->ndr.table;
    1449         const struct ndr_interface_call *call = &table->calls[opnum];
    1450         enum ndr_err_code ndr_err;
    1451 
    1452         /* make sure the recv code doesn't free the request, as we
    1453            need to grab the flags element before it is freed */
    1454         if (talloc_reference(p, req) == NULL) {
    1455                 return NT_STATUS_NO_MEMORY;
    1456         }
    1457 
    1458         status = dcerpc_request_recv(req, mem_ctx, &response);
    1459         if (!NT_STATUS_IS_OK(status)) {
    1460                 talloc_unlink(p, req);
    1461                 return status;
    1462         }
    1463 
    1464         flags = req->flags;
    1465 
    1466         /* prepare for ndr_pull_* */
    1467         pull = ndr_pull_init_flags(p->conn, &response, mem_ctx);
    1468         if (!pull) {
    1469                 talloc_unlink(p, req);
    1470                 return NT_STATUS_NO_MEMORY;
    1471         }
    1472 
    1473         if (pull->data) {
    1474                 pull->data = talloc_steal(pull, pull->data);
    1475         }
    1476         talloc_unlink(p, req);
    1477 
    1478         if (flags & DCERPC_PULL_BIGENDIAN) {
    1479                 pull->flags |= LIBNDR_FLAG_BIGENDIAN;
    1480         }
    1481 
    1482         DEBUG(10,("rpc reply data:\n"));
    1483         dump_data(10, pull->data, pull->data_size);
    1484 
    1485         /* pull the structure from the blob */
    1486         ndr_err = call->ndr_pull(pull, NDR_OUT, r);
    1487         if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    1488                 status = ndr_map_error2ntstatus(ndr_err);
    1489                 dcerpc_log_packet(p->conn->packet_log_dir,
    1490                                                   table, opnum, NDR_OUT,
    1491                                                   &response);
    1492                 return status;
    1493         }
    1494 
    1495         if (p->conn->flags & DCERPC_DEBUG_VALIDATE_OUT) {
    1496                 status = dcerpc_ndr_validate_out(p->conn, pull, r, call->struct_size,
    1497                                                  call->ndr_push, call->ndr_pull,
    1498                                                  call->ndr_print);
    1499                 if (!NT_STATUS_IS_OK(status)) {
    1500                         dcerpc_log_packet(p->conn->packet_log_dir,
    1501                                                           table, opnum, NDR_OUT,
    1502                                   &response);
    1503                         return status;
    1504                 }
    1505         }
    1506 
    1507         if (pull->offset != pull->data_size) {
    1508                 DEBUG(0,("Warning! ignoring %d unread bytes in rpc packet!\n",
    1509                          pull->data_size - pull->offset));
    1510                 /* we used to return NT_STATUS_INFO_LENGTH_MISMATCH here,
    1511                    but it turns out that early versions of NT
    1512                    (specifically NT3.1) add junk onto the end of rpc
    1513                    packets, so if we want to interoperate at all with
    1514                    those versions then we need to ignore this error */
    1515         }
    1516 
    1517         /* TODO: make pull context independent from the output mem_ctx and free the pull context */
    1518 
    1519         return NT_STATUS_OK;
    1520 }
    1521 
    1522 
    1523 /*
    1524   a useful helper function for synchronous rpc requests
    1525 
    1526   this can be used when you have ndr push/pull functions in the
    1527   standard format
    1528 */
    1529 _PUBLIC_ NTSTATUS dcerpc_ndr_request(struct dcerpc_pipe *p,
    1530                             const struct GUID *object,
    1531                             const struct ndr_interface_table *table,
    1532                             uint32_t opnum,
    1533                             TALLOC_CTX *mem_ctx,
    1534                             void *r)
    1535 {
    1536         struct rpc_request *req;
    1537 
    1538         req = dcerpc_ndr_request_send(p, object, table, opnum, false, mem_ctx, r);
    1539         if (req == NULL) {
    1540                 return NT_STATUS_NO_MEMORY;
    1541         }
    1542 
    1543         return dcerpc_ndr_request_recv(req);
    1544 }
    1545 
    1546 
    15471775/*
    15481776  a useful function for retrieving the server name we connected to
     
    15631791  get the dcerpc auth_level for a open connection
    15641792*/
    1565 uint32_t dcerpc_auth_level(struct dcerpc_connection *c)
     1793uint32_t dcerpc_auth_level(struct dcecli_connection *c)
    15661794{
    15671795        uint8_t auth_level;
     
    16001828        }
    16011829
     1830        if (pkt->ptype == DCERPC_PKT_FAULT) {
     1831                DEBUG(5,("rpc fault: %s\n", dcerpc_errstr(c, pkt->u.fault.status)));
     1832                recv_pipe->last_fault_code = pkt->u.fault.status;
     1833                composite_error(c, NT_STATUS_NET_WRITE_FAULT);
     1834                return;
     1835        }
     1836
    16021837        if (pkt->ptype != DCERPC_PKT_ALTER_RESP ||
    16031838            pkt->u.alter_resp.num_results == 0 ||
    16041839            pkt->u.alter_resp.ctx_list[0].result != 0) {
     1840                recv_pipe->last_fault_code = DCERPC_NCA_S_PROTO_ERROR;
    16051841                composite_error(c, NT_STATUS_NET_WRITE_FAULT);
    16061842                return;
     
    16101846        if (recv_pipe->conn->security_state.auth_info &&
    16111847            pkt->u.alter_resp.auth_info.length) {
    1612                 enum ndr_err_code ndr_err;
    1613                 ndr_err = ndr_pull_struct_blob(
    1614                         &pkt->u.alter_resp.auth_info, recv_pipe,
    1615                         NULL,
    1616                         recv_pipe->conn->security_state.auth_info,
    1617                         (ndr_pull_flags_fn_t)ndr_pull_dcerpc_auth);
    1618                 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
    1619                         c->status = ndr_map_error2ntstatus(ndr_err);
    1620                         if (!composite_is_ok(c)) return;
     1848                struct dcecli_connection *conn = recv_pipe->conn;
     1849                NTSTATUS status;
     1850                uint32_t auth_length;
     1851                status = dcerpc_pull_auth_trailer(pkt, conn, &pkt->u.alter_resp.auth_info,
     1852                                                  conn->security_state.auth_info, &auth_length, true);
     1853                if (!NT_STATUS_IS_OK(status)) {
     1854                        composite_error(c, status);
     1855                        return;
    16211856                }
    16221857        }
     
    16741909
    16751910        /* construct the NDR form of the packet */
    1676         c->status = ncacn_push_auth(&blob, mem_ctx, p->conn->iconv_convenience, &pkt,
     1911        c->status = ncacn_push_auth(&blob, mem_ctx, &pkt,
    16771912                                    p->conn->security_state.auth_info);
    16781913        if (!composite_is_ok(c)) return c;
     
    17251960        return dcerpc_alter_context_recv(creq);
    17261961}
     1962
  • vendor/current/source4/librpc/rpc/dcerpc.h

    r414 r740  
    2525 * the so version number. */
    2626
    27 #ifndef __DCERPC_H__
    28 #define __DCERPC_H__
     27#ifndef __S4_DCERPC_H__
     28#define __S4_DCERPC_H__
    2929
    3030#include "../lib/util/data_blob.h"
    3131#include "librpc/gen_ndr/dcerpc.h"
    3232#include "../librpc/ndr/libndr.h"
    33 
    34 enum dcerpc_transport_t {
    35         NCA_UNKNOWN, NCACN_NP, NCACN_IP_TCP, NCACN_IP_UDP, NCACN_VNS_IPC,
    36         NCACN_VNS_SPP, NCACN_AT_DSP, NCADG_AT_DDP, NCALRPC, NCACN_UNIX_STREAM,
    37         NCADG_UNIX_DGRAM, NCACN_HTTP, NCADG_IPX, NCACN_SPX };
     33#include "../librpc/rpc/rpc_common.h"
     34
     35struct tevent_context;
     36struct tevent_req;
     37struct dcerpc_binding_handle;
     38struct tstream_context;
    3839
    3940/*
    4041  this defines a generic security context for signed/sealed dcerpc pipes.
    4142*/
    42 struct dcerpc_connection;
     43struct dcecli_connection;
    4344struct gensec_settings;
    44 struct dcerpc_security {
     45struct dcecli_security {
    4546        struct dcerpc_auth *auth_info;
    4647        struct gensec_security *generic_state;
    4748
    4849        /* get the session key */
    49         NTSTATUS (*session_key)(struct dcerpc_connection *, DATA_BLOB *);
     50        NTSTATUS (*session_key)(struct dcecli_connection *, DATA_BLOB *);
    5051};
    5152
     
    5354  this holds the information that is not specific to a particular rpc context_id
    5455*/
    55 struct dcerpc_connection {
     56struct rpc_request;
     57struct dcecli_connection {
    5658        uint32_t call_id;
    5759        uint32_t srv_max_xmit_frag;
    5860        uint32_t srv_max_recv_frag;
    5961        uint32_t flags;
    60         struct dcerpc_security security_state;
     62        struct dcecli_security security_state;
    6163        const char *binding_string;
    6264        struct tevent_context *event_ctx;
    63         struct smb_iconv_convenience *iconv_convenience;
    6465
    6566        /** Directory in which to save ndrdump-parseable files */
     
    7374                void *private_data;
    7475
    75                 NTSTATUS (*shutdown_pipe)(struct dcerpc_connection *, NTSTATUS status);
    76 
    77                 const char *(*peer_name)(struct dcerpc_connection *);
    78 
    79                 const char *(*target_hostname)(struct dcerpc_connection *);
     76                NTSTATUS (*shutdown_pipe)(struct dcecli_connection *, NTSTATUS status);
     77
     78                const char *(*peer_name)(struct dcecli_connection *);
     79
     80                const char *(*target_hostname)(struct dcecli_connection *);
    8081
    8182                /* send a request to the server */
    82                 NTSTATUS (*send_request)(struct dcerpc_connection *, DATA_BLOB *, bool trigger_read);
     83                NTSTATUS (*send_request)(struct dcecli_connection *, DATA_BLOB *, bool trigger_read);
    8384
    8485                /* send a read request to the server */
    85                 NTSTATUS (*send_read)(struct dcerpc_connection *);
     86                NTSTATUS (*send_read)(struct dcecli_connection *);
    8687
    8788                /* a callback to the dcerpc code when a full fragment
    8889                   has been received */
    89                 void (*recv_data)(struct dcerpc_connection *, DATA_BLOB *, NTSTATUS status);
     90                void (*recv_data)(struct dcecli_connection *, DATA_BLOB *, NTSTATUS status);
    9091        } transport;
    9192
     
    104105*/
    105106struct dcerpc_pipe {
     107        struct dcerpc_binding_handle *binding_handle;
     108
    106109        uint32_t context_id;
    107110
     
    111114        struct ndr_syntax_id transfer_syntax;
    112115
    113         struct dcerpc_connection *conn;
     116        struct dcecli_connection *conn;
    114117        struct dcerpc_binding *binding;
    115118
     
    123126/* default timeout for all rpc requests, in seconds */
    124127#define DCERPC_REQUEST_TIMEOUT 60
    125 
    126 
    127 /* dcerpc pipe flags */
    128 #define DCERPC_DEBUG_PRINT_IN          (1<<0)
    129 #define DCERPC_DEBUG_PRINT_OUT         (1<<1)
    130 #define DCERPC_DEBUG_PRINT_BOTH (DCERPC_DEBUG_PRINT_IN | DCERPC_DEBUG_PRINT_OUT)
    131 
    132 #define DCERPC_DEBUG_VALIDATE_IN       (1<<2)
    133 #define DCERPC_DEBUG_VALIDATE_OUT      (1<<3)
    134 #define DCERPC_DEBUG_VALIDATE_BOTH (DCERPC_DEBUG_VALIDATE_IN | DCERPC_DEBUG_VALIDATE_OUT)
    135 
    136 #define DCERPC_CONNECT                 (1<<4)
    137 #define DCERPC_SIGN                    (1<<5)
    138 #define DCERPC_SEAL                    (1<<6)
    139 
    140 #define DCERPC_PUSH_BIGENDIAN          (1<<7)
    141 #define DCERPC_PULL_BIGENDIAN          (1<<8)
    142 
    143 #define DCERPC_SCHANNEL                (1<<9)
    144 
    145 #define DCERPC_ANON_FALLBACK           (1<<10)
    146 
    147 /* use a 128 bit session key */
    148 #define DCERPC_SCHANNEL_128            (1<<12)
    149 
    150 /* check incoming pad bytes */
    151 #define DCERPC_DEBUG_PAD_CHECK         (1<<13)
    152 
    153 /* set LIBNDR_FLAG_REF_ALLOC flag when decoding NDR */
    154 #define DCERPC_NDR_REF_ALLOC           (1<<14)
    155 
    156 #define DCERPC_AUTH_OPTIONS    (DCERPC_SEAL|DCERPC_SIGN|DCERPC_SCHANNEL|DCERPC_AUTH_SPNEGO|DCERPC_AUTH_KRB5|DCERPC_AUTH_NTLM)
    157 
    158 /* select spnego auth */
    159 #define DCERPC_AUTH_SPNEGO             (1<<15)
    160 
    161 /* select krb5 auth */
    162 #define DCERPC_AUTH_KRB5               (1<<16)
    163 
    164 #define DCERPC_SMB2                    (1<<17)
    165 
    166 /* select NTLM auth */
    167 #define DCERPC_AUTH_NTLM               (1<<18)
    168 
    169 /* this triggers the DCERPC_PFC_FLAG_CONC_MPX flag in the bind request */
    170 #define DCERPC_CONCURRENT_MULTIPLEX     (1<<19)
    171 
    172 /* this triggers the DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN flag in the bind request */
    173 #define DCERPC_HEADER_SIGNING          (1<<20)
    174 
    175 /* use NDR64 transport */
    176 #define DCERPC_NDR64                   (1<<21)
    177 
    178 /* this describes a binding to a particular transport/pipe */
    179 struct dcerpc_binding {
    180         enum dcerpc_transport_t transport;
    181         struct ndr_syntax_id object;
    182         const char *host;
    183         const char *target_hostname;
    184         const char *endpoint;
    185         const char **options;
    186         uint32_t flags;
    187         uint32_t assoc_group_id;
    188 };
    189128
    190129
     
    199138
    200139
    201 enum rpc_request_state {
    202         RPC_REQUEST_QUEUED,
    203         RPC_REQUEST_PENDING,
    204         RPC_REQUEST_DONE
    205 };
    206 
    207 /*
    208   handle for an async dcerpc request
    209 */
    210 struct rpc_request {
    211         struct rpc_request *next, *prev;
    212         struct dcerpc_pipe *p;
    213         NTSTATUS status;
    214         uint32_t call_id;
    215         enum rpc_request_state state;
    216         DATA_BLOB payload;
    217         uint32_t flags;
    218         uint32_t fault_code;
    219 
    220         /* this is used to distinguish bind and alter_context requests
    221            from normal requests */
    222         void (*recv_handler)(struct rpc_request *conn,
    223                              DATA_BLOB *blob, struct ncacn_packet *pkt);
    224 
    225         const struct GUID *object;
    226         uint16_t opnum;
    227         DATA_BLOB request_data;
    228         bool async_call;
    229         bool ignore_timeout;
    230 
    231         /* use by the ndr level async recv call */
    232         struct {
    233                 const struct ndr_interface_table *table;
    234                 uint32_t opnum;
    235                 void *struct_ptr;
    236                 TALLOC_CTX *mem_ctx;
    237         } ndr;
    238 
    239         struct {
    240                 void (*callback)(struct rpc_request *);
    241                 void *private_data;
    242         } async;
    243 };
    244 
    245140struct epm_tower;
    246141struct epm_floor;
     
    257152                             struct tevent_context *ev,
    258153                             struct loadparm_context *lp_ctx);
    259 NTSTATUS dcerpc_ndr_request_recv(struct rpc_request *req);
    260 struct rpc_request *dcerpc_ndr_request_send(struct dcerpc_pipe *p,
    261                                                 const struct GUID *object,
    262                                                 const struct ndr_interface_table *table,
    263                                                 uint32_t opnum,
    264                                                 bool async,
    265                                                 TALLOC_CTX *mem_ctx,
    266                                                 void *r);
    267154const char *dcerpc_server_name(struct dcerpc_pipe *p);
    268 struct dcerpc_pipe *dcerpc_pipe_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
    269                                      struct smb_iconv_convenience *ic);
     155struct dcerpc_pipe *dcerpc_pipe_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev);
    270156NTSTATUS dcerpc_pipe_open_smb(struct dcerpc_pipe *p,
    271157                              struct smbcli_tree *tree,
     
    278164NTSTATUS dcerpc_secondary_connection_recv(struct composite_context *c,
    279165                                          struct dcerpc_pipe **p2);
    280 NTSTATUS dcerpc_parse_binding(TALLOC_CTX *mem_ctx, const char *s, struct dcerpc_binding **b_out);
    281166
    282167struct composite_context* dcerpc_pipe_connect_b_send(TALLOC_CTX *parent_ctx,
     
    297182                               struct tevent_context *ev,
    298183                               struct loadparm_context *lp_ctx);
    299 const char *dcerpc_errstr(TALLOC_CTX *mem_ctx, uint32_t fault_code);
    300184
    301185NTSTATUS dcerpc_pipe_auth(TALLOC_CTX *mem_ctx,
     
    305189                          struct cli_credentials *credentials,
    306190                          struct loadparm_context *lp_ctx);
    307 char *dcerpc_binding_string(TALLOC_CTX *mem_ctx, const struct dcerpc_binding *b);
    308191NTSTATUS dcerpc_secondary_connection(struct dcerpc_pipe *p,
    309192                                     struct dcerpc_pipe **p2,
     
    317200struct tevent_context *dcerpc_event_context(struct dcerpc_pipe *p);
    318201NTSTATUS dcerpc_init(struct loadparm_context *lp_ctx);
    319 struct smbcli_tree *dcerpc_smb_tree(struct dcerpc_connection *c);
    320 uint16_t dcerpc_smb_fnum(struct dcerpc_connection *c);
     202struct smbcli_tree *dcerpc_smb_tree(struct dcecli_connection *c);
     203uint16_t dcerpc_smb_fnum(struct dcecli_connection *c);
    321204NTSTATUS dcerpc_secondary_context(struct dcerpc_pipe *p,
    322205                                  struct dcerpc_pipe **pp2,
     
    357240                                                           struct dcerpc_binding *b);
    358241void dcerpc_log_packet(const char *lockdir,
    359                                            const struct ndr_interface_table *ndr,
    360                                            uint32_t opnum, uint32_t flags,
    361                                            DATA_BLOB *pkt);
    362 NTSTATUS dcerpc_binding_build_tower(TALLOC_CTX *mem_ctx,
    363                                     const struct dcerpc_binding *binding,
    364                                     struct epm_tower *tower);
    365 
    366 NTSTATUS dcerpc_floor_get_lhs_data(const struct epm_floor *epm_floor, struct ndr_syntax_id *syntax);
    367 
    368 enum dcerpc_transport_t dcerpc_transport_by_tower(const struct epm_tower *tower);
    369 const char *derpc_transport_string_by_transport(enum dcerpc_transport_t t);
    370 
    371 NTSTATUS dcerpc_ndr_request(struct dcerpc_pipe *p,
    372                             const struct GUID *object,
    373                             const struct ndr_interface_table *table,
    374                             uint32_t opnum,
    375                             TALLOC_CTX *mem_ctx,
    376                             void *r);
    377 
    378 NTSTATUS dcerpc_binding_from_tower(TALLOC_CTX *mem_ctx,
    379                                    struct epm_tower *tower,
    380                                    struct dcerpc_binding **b_out);
    381 
    382 NTSTATUS dcerpc_request(struct dcerpc_pipe *p,
    383                         struct GUID *object,
    384                         uint16_t opnum,
    385                         TALLOC_CTX *mem_ctx,
    386                         DATA_BLOB *stub_data_in,
    387                         DATA_BLOB *stub_data_out);
    388 
    389 typedef NTSTATUS (*dcerpc_call_fn) (struct dcerpc_pipe *, TALLOC_CTX *, void *);
     242                       const struct ndr_interface_table *ndr,
     243                       uint32_t opnum, uint32_t flags,
     244                       const DATA_BLOB *pkt);
     245
    390246
    391247enum dcerpc_transport_t dcerpc_transport_by_endpoint_protocol(int prot);
     
    393249const char *dcerpc_floor_get_rhs_data(TALLOC_CTX *mem_ctx, struct epm_floor *epm_floor);
    394250
    395 #endif /* __DCERPC_H__ */
     251#endif /* __S4_DCERPC_H__ */
  • vendor/current/source4/librpc/rpc/dcerpc.py

    r414 r740  
    1 #!/usr/bin/python
     1#!/usr/bin/env python
    22
    33# Unix SMB/CIFS implementation.
  • vendor/current/source4/librpc/rpc/dcerpc_auth.c

    r414 r740  
    115115{
    116116        struct bind_auth_state *state;
    117         struct dcerpc_security *sec;
     117        struct dcecli_security *sec;
    118118        struct composite_context *creq;
    119119        bool more_processing = false;
     
    234234        struct composite_context *c, *creq;
    235235        struct bind_auth_state *state;
    236         struct dcerpc_security *sec;
     236        struct dcecli_security *sec;
    237237
    238238        struct ndr_syntax_id syntax, transfer_syntax;
     
    293293        }
    294294
     295        if (p->binding && p->binding->target_principal) {
     296                c->status = gensec_set_target_principal(sec->generic_state,
     297                                                        p->binding->target_principal);
     298                if (!NT_STATUS_IS_OK(c->status)) {
     299                        DEBUG(1, ("Failed to set GENSEC target principal to %s: %s\n",
     300                                  p->binding->target_principal, nt_errstr(c->status)));
     301                        composite_error(c, c->status);
     302                        return c;
     303                }
     304        }
     305
    295306        c->status = gensec_start_mech_by_authtype(sec->generic_state,
    296307                                                  auth_type, auth_level);
  • vendor/current/source4/librpc/rpc/dcerpc_connect.c

    r414 r740  
    112112           remote rpc server */
    113113        conn->in.dest_host              = s->io.binding->host;
    114         conn->in.dest_ports                  = lp_smb_ports(lp_ctx);
     114        conn->in.dest_ports                  = lpcfg_smb_ports(lp_ctx);
    115115        if (s->io.binding->target_hostname == NULL)
    116116                conn->in.called_name = "*SMBSERVER"; /* FIXME: This is invalid */
    117117        else
    118118                conn->in.called_name            = s->io.binding->target_hostname;
    119         conn->in.socket_options         = lp_socket_options(lp_ctx);
     119        conn->in.socket_options         = lpcfg_socket_options(lp_ctx);
    120120        conn->in.service                = "IPC$";
    121121        conn->in.service_type           = NULL;
    122         conn->in.workgroup              = lp_workgroup(lp_ctx);
    123         conn->in.gensec_settings = lp_gensec_settings(conn, lp_ctx);
    124         conn->in.iconv_convenience = lp_iconv_convenience(lp_ctx);
    125 
    126         lp_smbcli_options(lp_ctx, &conn->in.options);
    127         lp_smbcli_session_options(lp_ctx, &conn->in.session_options);
     122        conn->in.workgroup              = lpcfg_workgroup(lp_ctx);
     123        conn->in.gensec_settings = lpcfg_gensec_settings(conn, lp_ctx);
     124
     125        lpcfg_smbcli_options(lp_ctx, &conn->in.options);
     126        lpcfg_smbcli_session_options(lp_ctx, &conn->in.session_options);
    128127
    129128        /*
     
    246245        }
    247246
    248         lp_smbcli_options(lp_ctx, &options);
     247        lpcfg_smbcli_options(lp_ctx, &options);
    249248
    250249        /* send smb2 connect request */
    251250        conn_req = smb2_connect_send(mem_ctx, s->io.binding->host,
    252                         lp_parm_string_list(mem_ctx, lp_ctx, NULL, "smb2", "ports", NULL),
     251                        lpcfg_parm_string_list(mem_ctx, lp_ctx, NULL, "smb2", "ports", NULL),
    253252                                        "IPC$",
    254253                                     s->io.resolve_ctx,
     
    256255                                     c->event_ctx,
    257256                                     &options,
    258                                          lp_socket_options(lp_ctx),
    259                                          lp_gensec_settings(mem_ctx, lp_ctx)
     257                                         lpcfg_socket_options(lp_ctx),
     258                                         lpcfg_gensec_settings(mem_ctx, lp_ctx)
    260259                                         );
    261260        composite_continue(c, conn_req, continue_smb2_connect, c);
     
    278277struct pipe_ip_tcp_state {
    279278        struct dcerpc_pipe_connect io;
     279        const char *localaddr;
    280280        const char *host;
    281281        const char *target_hostname;
     
    321321        /* store input parameters in state structure */
    322322        s->io               = *io;
     323        s->localaddr        = talloc_reference(c, io->binding->localaddress);
    323324        s->host             = talloc_reference(c, io->binding->host);
    324325        s->target_hostname  = talloc_reference(c, io->binding->target_hostname);
     
    327328
    328329        /* send pipe open request on tcp/ip */
    329         pipe_req = dcerpc_pipe_open_tcp_send(s->io.pipe->conn, s->host, s->target_hostname,
     330        pipe_req = dcerpc_pipe_open_tcp_send(s->io.pipe->conn, s->localaddr, s->host, s->target_hostname,
    330331                                             s->port, io->resolve_ctx);
    331332        composite_continue(c, pipe_req, continue_pipe_open_ncacn_ip_tcp, c);
     
    464465
    465466        /* send pipe open request */
    466         pipe_req = dcerpc_pipe_open_pipe_send(s->io.pipe->conn, lp_ncalrpc_dir(lp_ctx),
     467        pipe_req = dcerpc_pipe_open_pipe_send(s->io.pipe->conn, lpcfg_ncalrpc_dir(lp_ctx),
    467468                                              s->io.binding->endpoint);
    468469        composite_continue(c, pipe_req, continue_pipe_open_ncalrpc, c);
     
    516517        if (!composite_is_ok(c)) return;
    517518
    518         DEBUG(2,("Mapped to DCERPC endpoint %s\n", s->binding->endpoint));
     519        DEBUG(4,("Mapped to DCERPC endpoint %s\n", s->binding->endpoint));
    519520       
    520521        continue_connect(c, s);
     
    539540        pc.pipe         = s->pipe;
    540541        pc.binding      = s->binding;
     542        pc.pipe_name    = NULL;
    541543        pc.interface    = s->table;
    542544        pc.creds        = s->credentials;
    543         pc.resolve_ctx  = lp_resolve_context(s->lp_ctx);
     545        pc.resolve_ctx  = lpcfg_resolve_context(s->lp_ctx);
    544546
    545547        /* connect dcerpc pipe depending on required transport */
     
    744746
    745747        /* initialise dcerpc pipe structure */
    746         s->pipe = dcerpc_pipe_init(c, ev, lp_iconv_convenience(lp_ctx));
     748        s->pipe = dcerpc_pipe_init(c, ev);
    747749        if (composite_nomem(s->pipe, c)) return c;
    748750
    749751        if (DEBUGLEVEL >= 10)
    750                 s->pipe->conn->packet_log_dir = lp_lockdir(lp_ctx);
     752                s->pipe->conn->packet_log_dir = lpcfg_lockdir(lp_ctx);
    751753
    752754        /* store parameters in state structure */
  • vendor/current/source4/librpc/rpc/dcerpc_schannel.c

    r414 r740  
    2323
    2424#include "includes.h"
     25#include <tevent.h>
    2526#include "auth/auth.h"
    2627#include "libcli/composite/composite.h"
     
    5051static void continue_secondary_connection(struct composite_context *ctx);
    5152static void continue_bind_auth_none(struct composite_context *ctx);
    52 static void continue_srv_challenge(struct rpc_request *req);
    53 static void continue_srv_auth2(struct rpc_request *req);
     53static void continue_srv_challenge(struct tevent_req *subreq);
     54static void continue_srv_auth2(struct tevent_req *subreq);
    5455
    5556
     
    120121        struct composite_context *c;
    121122        struct schannel_key_state *s;
    122         struct rpc_request *srv_challenge_req;
     123        struct tevent_req *subreq;
    123124
    124125        c = talloc_get_type(ctx->async.private_data, struct composite_context);
     
    141142          request a netlogon challenge - a rpc request over opened secondary pipe
    142143        */
    143         srv_challenge_req = dcerpc_netr_ServerReqChallenge_send(s->pipe2, c, &s->r);
    144         if (composite_nomem(srv_challenge_req, c)) return;
    145 
    146         composite_continue_rpc(c, srv_challenge_req, continue_srv_challenge, c);
     144        subreq = dcerpc_netr_ServerReqChallenge_r_send(s, c->event_ctx,
     145                                                       s->pipe2->binding_handle,
     146                                                       &s->r);
     147        if (composite_nomem(subreq, c)) return;
     148
     149        tevent_req_set_callback(subreq, continue_srv_challenge, c);
    147150}
    148151
     
    152155  on the netlogon pipe
    153156*/
    154 static void continue_srv_challenge(struct rpc_request *req)
    155 {
    156         struct composite_context *c;
    157         struct schannel_key_state *s;
    158         struct rpc_request *srv_auth2_req;
    159 
    160         c = talloc_get_type(req->async.private_data, struct composite_context);
     157static void continue_srv_challenge(struct tevent_req *subreq)
     158{
     159        struct composite_context *c;
     160        struct schannel_key_state *s;
     161
     162        c = tevent_req_callback_data(subreq, struct composite_context);
    161163        s = talloc_get_type(c->private_data, struct schannel_key_state);
    162164
    163165        /* receive rpc request result - netlogon challenge */
    164         c->status = dcerpc_ndr_request_recv(req);
     166        c->status = dcerpc_netr_ServerReqChallenge_r_recv(subreq, s);
     167        TALLOC_FREE(subreq);
    165168        if (!composite_is_ok(c)) return;
    166169
     
    190193          authenticate on the netlogon pipe - a rpc request over secondary pipe
    191194        */
    192         srv_auth2_req = dcerpc_netr_ServerAuthenticate2_send(s->pipe2, c, &s->a);
    193         if (composite_nomem(srv_auth2_req, c)) return;
    194 
    195         composite_continue_rpc(c, srv_auth2_req, continue_srv_auth2, c);
     195        subreq = dcerpc_netr_ServerAuthenticate2_r_send(s, c->event_ctx,
     196                                                        s->pipe2->binding_handle,
     197                                                        &s->a);
     198        if (composite_nomem(subreq, c)) return;
     199
     200        tevent_req_set_callback(subreq, continue_srv_auth2, c);
    196201}
    197202
     
    201206  received credentials
    202207*/
    203 static void continue_srv_auth2(struct rpc_request *req)
    204 {
    205         struct composite_context *c;
    206         struct schannel_key_state *s;
    207 
    208         c = talloc_get_type(req->async.private_data, struct composite_context);
     208static void continue_srv_auth2(struct tevent_req *subreq)
     209{
     210        struct composite_context *c;
     211        struct schannel_key_state *s;
     212
     213        c = tevent_req_callback_data(subreq, struct composite_context);
    209214        s = talloc_get_type(c->private_data, struct schannel_key_state);
    210215
    211216        /* receive rpc request result - auth2 credentials */
    212         c->status = dcerpc_ndr_request_recv(req);
     217        c->status = dcerpc_netr_ServerAuthenticate2_r_recv(subreq, s);
     218        TALLOC_FREE(subreq);
    213219        if (!composite_is_ok(c)) return;
    214220
     
    238244        struct schannel_key_state *s;
    239245        struct composite_context *epm_map_req;
     246        enum netr_SchannelType schannel_type = cli_credentials_get_secure_channel_type(credentials);
    240247       
    241248        /* composite context allocation and setup */
     
    253260        /* allocate credentials */
    254261        /* type of authentication depends on schannel type */
    255         if (s->pipe->conn->flags & DCERPC_SCHANNEL_128) {
     262        if (schannel_type == SEC_CHAN_RODC) {
     263                s->negotiate_flags = NETLOGON_NEG_AUTH2_RODC_FLAGS;
     264        } else if (s->pipe->conn->flags & DCERPC_SCHANNEL_128) {
    256265                s->negotiate_flags = NETLOGON_NEG_AUTH2_ADS_FLAGS;
    257266        } else {
     
    260269
    261270        /* allocate binding structure */
    262         s->binding = talloc(c, struct dcerpc_binding);
     271        s->binding = talloc_zero(c, struct dcerpc_binding);
    263272        if (composite_nomem(s->binding, c)) return c;
    264273
     
    312321        struct auth_schannel_state *s = talloc_get_type(c->private_data,
    313322                                                        struct auth_schannel_state);
     323        NTSTATUS status;
    314324
    315325        /* receive schannel key */
    316         c->status = dcerpc_schannel_key_recv(ctx);
     326        status = c->status = dcerpc_schannel_key_recv(ctx);
    317327        if (!composite_is_ok(c)) {
    318                 DEBUG(1, ("Failed to setup credentials for account %s: %s\n",
    319                           cli_credentials_get_username(s->credentials), nt_errstr(c->status)));
     328                DEBUG(1, ("Failed to setup credentials: %s\n", nt_errstr(status)));
    320329                return;
    321330        }
     
    323332        /* send bind auth request with received creds */
    324333        auth_req = dcerpc_bind_auth_send(c, s->pipe, s->table, s->credentials,
    325                                          lp_gensec_settings(c, s->lp_ctx),
     334                                         lpcfg_gensec_settings(c, s->lp_ctx),
    326335                                         DCERPC_AUTH_TYPE_SCHANNEL, s->auth_level,
    327336                                         NULL);
  • vendor/current/source4/librpc/rpc/dcerpc_secondary.c

    r414 r740  
    7474
    7575        /* initialise second dcerpc pipe based on primary pipe's event context */
    76         s->pipe2 = dcerpc_pipe_init(c, s->pipe->conn->event_ctx, s->pipe->conn->iconv_convenience);
     76        s->pipe2 = dcerpc_pipe_init(c, s->pipe->conn->event_ctx);
    7777        if (composite_nomem(s->pipe2, c)) return c;
    7878
     
    103103
    104104                pipe_tcp_req = dcerpc_pipe_open_tcp_send(s->pipe2->conn,
     105                                                         s->binding->localaddress,
    105106                                                         s->peer_addr->addr,
    106107                                                         s->binding->target_hostname,
  • vendor/current/source4/librpc/rpc/dcerpc_smb.c

    r414 r740  
    2626#include "librpc/rpc/dcerpc.h"
    2727#include "librpc/rpc/dcerpc_proto.h"
     28#include "librpc/rpc/rpc_common.h"
    2829
    2930/* transport private information used by SMB pipe transport */
     
    3940  tell the dcerpc layer that the transport is dead
    4041*/
    41 static void pipe_dead(struct dcerpc_connection *c, NTSTATUS status)
     42static void pipe_dead(struct dcecli_connection *c, NTSTATUS status)
    4243{
    4344        struct smb_private *smb = (struct smb_private *)c->transport.private_data;
     
    6768*/
    6869struct smb_read_state {
    69         struct dcerpc_connection *c;
     70        struct dcecli_connection *c;
    7071        struct smbcli_request *req;
    7172        size_t received;
     
    110111        if (frag_length <= state->received) {
    111112                DATA_BLOB data = state->data;
    112                 struct dcerpc_connection *c = state->c;
     113                struct dcecli_connection *c = state->c;
    113114                data.length = state->received;
    114115                talloc_steal(state->c, data.data);
     
    141142  data in the read buffer
    142143*/
    143 static NTSTATUS send_read_request_continue(struct dcerpc_connection *c, DATA_BLOB *blob)
     144static NTSTATUS send_read_request_continue(struct dcecli_connection *c, DATA_BLOB *blob)
    144145{
    145146        struct smb_private *smb = (struct smb_private *)c->transport.private_data;
     
    197198  trigger a read request from the server
    198199*/
    199 static NTSTATUS send_read_request(struct dcerpc_connection *c)
     200static NTSTATUS send_read_request(struct dcecli_connection *c)
    200201{
    201202        struct smb_private *smb = (struct smb_private *)c->transport.private_data;
     
    212213*/
    213214struct smb_trans_state {
    214         struct dcerpc_connection *c;
     215        struct dcecli_connection *c;
    215216        struct smbcli_request *req;
    216217        struct smb_trans2 *trans;
     
    223224{
    224225        struct smb_trans_state *state = (struct smb_trans_state *)req->async.private_data;
    225         struct dcerpc_connection *c = state->c;
     226        struct dcecli_connection *c = state->c;
    226227        NTSTATUS status;
    227228
     
    249250  send a SMBtrans style request
    250251*/
    251 static NTSTATUS smb_send_trans_request(struct dcerpc_connection *c, DATA_BLOB *blob)
     252static NTSTATUS smb_send_trans_request(struct dcecli_connection *c, DATA_BLOB *blob)
    252253{
    253254        struct smb_private *smb = (struct smb_private *)c->transport.private_data;
     
    306307static void smb_write_callback(struct smbcli_request *req)
    307308{
    308         struct dcerpc_connection *c = (struct dcerpc_connection *)req->async.private_data;
     309        struct dcecli_connection *c = (struct dcecli_connection *)req->async.private_data;
    309310
    310311        if (!NT_STATUS_IS_OK(req->status)) {
     
    319320   send a packet to the server
    320321*/
    321 static NTSTATUS smb_send_request(struct dcerpc_connection *c, DATA_BLOB *blob,
     322static NTSTATUS smb_send_request(struct dcecli_connection *c, DATA_BLOB *blob,
    322323                                 bool trigger_read)
    323324{
     
    370371   shutdown SMB pipe connection
    371372*/
    372 static NTSTATUS smb_shutdown_pipe(struct dcerpc_connection *c, NTSTATUS status)
     373static NTSTATUS smb_shutdown_pipe(struct dcecli_connection *c, NTSTATUS status)
    373374{
    374375        struct smb_private *smb = (struct smb_private *)c->transport.private_data;
     
    397398  return SMB server name (called name)
    398399*/
    399 static const char *smb_peer_name(struct dcerpc_connection *c)
     400static const char *smb_peer_name(struct dcecli_connection *c)
    400401{
    401402        struct smb_private *smb = (struct smb_private *)c->transport.private_data;
     
    407408  return remote name we make the actual connection (good for kerberos)
    408409*/
    409 static const char *smb_target_hostname(struct dcerpc_connection *c)
     410static const char *smb_target_hostname(struct dcecli_connection *c)
    410411{
    411412        struct smb_private *smb = talloc_get_type(c->transport.private_data, struct smb_private);
     
    417418  fetch the user session key
    418419*/
    419 static NTSTATUS smb_session_key(struct dcerpc_connection *c, DATA_BLOB *session_key)
     420static NTSTATUS smb_session_key(struct dcecli_connection *c, DATA_BLOB *session_key)
    420421{
    421422        struct smb_private *smb = (struct smb_private *)c->transport.private_data;
     
    431432struct pipe_open_smb_state {
    432433        union smb_open *open;
    433         struct dcerpc_connection *c;
     434        struct dcecli_connection *c;
    434435        struct smbcli_tree *tree;
    435436        struct composite_context *ctx;
     
    445446        struct pipe_open_smb_state *state;
    446447        struct smbcli_request *req;
    447         struct dcerpc_connection *c = p->conn;
     448        struct dcecli_connection *c = p->conn;
    448449
    449450        /* if we don't have a binding on this pipe yet, then create one */
     
    477478        state->open->ntcreatex.level = RAW_OPEN_NTCREATEX;
    478479        state->open->ntcreatex.in.flags = 0;
    479         state->open->ntcreatex.in.root_fid = 0;
     480        state->open->ntcreatex.in.root_fid.fnum = 0;
    480481        state->open->ntcreatex.in.access_mask =
    481482                SEC_STD_READ_CONTROL |
     
    515516                                            struct pipe_open_smb_state);
    516517        struct composite_context *ctx = state->ctx;
    517         struct dcerpc_connection *c = state->c;
     518        struct dcecli_connection *c = state->c;
    518519        struct smb_private *smb;
    519520       
     
    571572  return the SMB tree used for a dcerpc over SMB pipe
    572573*/
    573 _PUBLIC_ struct smbcli_tree *dcerpc_smb_tree(struct dcerpc_connection *c)
     574_PUBLIC_ struct smbcli_tree *dcerpc_smb_tree(struct dcecli_connection *c)
    574575{
    575576        struct smb_private *smb;
     
    586587  return the SMB fnum used for a dcerpc over SMB pipe (hack for torture operations)
    587588*/
    588 _PUBLIC_ uint16_t dcerpc_smb_fnum(struct dcerpc_connection *c)
     589_PUBLIC_ uint16_t dcerpc_smb_fnum(struct dcecli_connection *c)
    589590{
    590591        struct smb_private *smb;
  • vendor/current/source4/librpc/rpc/dcerpc_smb2.c

    r414 r740  
    2828#include "librpc/rpc/dcerpc.h"
    2929#include "librpc/rpc/dcerpc_proto.h"
     30#include "librpc/rpc/rpc_common.h"
    3031
    3132/* transport private information used by SMB2 pipe transport */
     
    4142  tell the dcerpc layer that the transport is dead
    4243*/
    43 static void pipe_dead(struct dcerpc_connection *c, NTSTATUS status)
     44static void pipe_dead(struct dcecli_connection *c, NTSTATUS status)
    4445{
    4546        struct smb2_private *smb = (struct smb2_private *)c->transport.private_data;
     
    6970*/
    7071struct smb2_read_state {
    71         struct dcerpc_connection *c;
     72        struct dcecli_connection *c;
    7273        DATA_BLOB data;
    7374};
     
    113114        if (frag_length <= state->data.length) {
    114115                DATA_BLOB data = state->data;
    115                 struct dcerpc_connection *c = state->c;
     116                struct dcecli_connection *c = state->c;
    116117                talloc_steal(c, data.data);
    117118                talloc_free(state);
     
    145146  data in the read buffer
    146147*/
    147 static NTSTATUS send_read_request_continue(struct dcerpc_connection *c, DATA_BLOB *blob)
     148static NTSTATUS send_read_request_continue(struct dcecli_connection *c, DATA_BLOB *blob)
    148149{
    149150        struct smb2_private *smb = (struct smb2_private *)c->transport.private_data;
     
    190191  trigger a read request from the server
    191192*/
    192 static NTSTATUS send_read_request(struct dcerpc_connection *c)
     193static NTSTATUS send_read_request(struct dcecli_connection *c)
    193194{
    194195        struct smb2_private *smb = (struct smb2_private *)c->transport.private_data;
     
    205206*/
    206207struct smb2_trans_state {
    207         struct dcerpc_connection *c;
     208        struct dcecli_connection *c;
    208209};
    209210
     
    215216        struct smb2_trans_state *state = talloc_get_type(req->async.private_data,
    216217                                                        struct smb2_trans_state);
    217         struct dcerpc_connection *c = state->c;
     218        struct dcecli_connection *c = state->c;
    218219        NTSTATUS status;
    219220        struct smb2_ioctl io;
     
    241242  send a SMBtrans style request, using a named pipe read_write fsctl
    242243*/
    243 static NTSTATUS smb2_send_trans_request(struct dcerpc_connection *c, DATA_BLOB *blob)
     244static NTSTATUS smb2_send_trans_request(struct dcecli_connection *c, DATA_BLOB *blob)
    244245{
    245246        struct smb2_private *smb = talloc_get_type(c->transport.private_data,
     
    282283static void smb2_write_callback(struct smb2_request *req)
    283284{
    284         struct dcerpc_connection *c = (struct dcerpc_connection *)req->async.private_data;
     285        struct dcecli_connection *c = (struct dcecli_connection *)req->async.private_data;
    285286
    286287        if (!NT_STATUS_IS_OK(req->status)) {
     
    295296   send a packet to the server
    296297*/
    297 static NTSTATUS smb2_send_request(struct dcerpc_connection *c, DATA_BLOB *blob,
     298static NTSTATUS smb2_send_request(struct dcecli_connection *c, DATA_BLOB *blob,
    298299                                  bool trigger_read)
    299300{
     
    333334   shutdown SMB pipe connection
    334335*/
    335 static NTSTATUS smb2_shutdown_pipe(struct dcerpc_connection *c, NTSTATUS status)
     336static NTSTATUS smb2_shutdown_pipe(struct dcecli_connection *c, NTSTATUS status)
    336337{
    337338        struct smb2_private *smb = (struct smb2_private *)c->transport.private_data;
     
    358359  return SMB server name
    359360*/
    360 static const char *smb2_peer_name(struct dcerpc_connection *c)
     361static const char *smb2_peer_name(struct dcecli_connection *c)
    361362{
    362363        struct smb2_private *smb = talloc_get_type(c->transport.private_data,
     
    368369  return remote name we make the actual connection (good for kerberos)
    369370*/
    370 static const char *smb2_target_hostname(struct dcerpc_connection *c)
     371static const char *smb2_target_hostname(struct dcecli_connection *c)
    371372{
    372373        struct smb2_private *smb = talloc_get_type(c->transport.private_data,
     
    378379  fetch the user session key
    379380*/
    380 static NTSTATUS smb2_session_key(struct dcerpc_connection *c, DATA_BLOB *session_key)
     381static NTSTATUS smb2_session_key(struct dcecli_connection *c, DATA_BLOB *session_key)
    381382{
    382383        struct smb2_private *smb = talloc_get_type(c->transport.private_data,
     
    390391
    391392struct pipe_open_smb2_state {
    392         struct dcerpc_connection *c;
     393        struct dcecli_connection *c;
    393394        struct composite_context *ctx;
    394395};
     
    404405        struct smb2_create io;
    405406        struct smb2_request *req;
    406         struct dcerpc_connection *c = p->conn;
     407        struct dcecli_connection *c = p->conn;
    407408
    408409        ctx = composite_create(c, c->event_ctx);
     
    453454                                struct pipe_open_smb2_state);
    454455        struct composite_context *ctx = state->ctx;
    455         struct dcerpc_connection *c = state->c;
     456        struct dcecli_connection *c = state->c;
    456457        struct smb2_tree *tree = req->tree;
    457458        struct smb2_private *smb;
     
    510511  return the SMB2 tree used for a dcerpc over SMB2 pipe
    511512*/
    512 struct smb2_tree *dcerpc_smb2_tree(struct dcerpc_connection *c)
     513struct smb2_tree *dcerpc_smb2_tree(struct dcecli_connection *c)
    513514{
    514515        struct smb2_private *smb = talloc_get_type(c->transport.private_data,
  • vendor/current/source4/librpc/rpc/dcerpc_sock.c

    r414 r740  
    3030#include "librpc/rpc/dcerpc_proto.h"
    3131#include "libcli/resolve/resolve.h"
     32#include "librpc/rpc/rpc_common.h"
    3233
    3334/* transport private information used by general socket pipe transports */
     
    4748  mark the socket dead
    4849*/
    49 static void sock_dead(struct dcerpc_connection *p, NTSTATUS status)
     50static void sock_dead(struct dcecli_connection *p, NTSTATUS status)
    5051{
    5152        struct sock_private *sock = (struct sock_private *)p->transport.private_data;
     
    8889static void sock_error_handler(void *private_data, NTSTATUS status)
    8990{
    90         struct dcerpc_connection *p = talloc_get_type(private_data,
    91                                                       struct dcerpc_connection);
     91        struct dcecli_connection *p = talloc_get_type(private_data,
     92                                                      struct dcecli_connection);
    9293        sock_dead(p, status);
    9394}
     
    113114static NTSTATUS sock_process_recv(void *private_data, DATA_BLOB blob)
    114115{
    115         struct dcerpc_connection *p = talloc_get_type(private_data,
    116                                                       struct dcerpc_connection);
     116        struct dcecli_connection *p = talloc_get_type(private_data,
     117                                                      struct dcecli_connection);
    117118        struct sock_private *sock = (struct sock_private *)p->transport.private_data;
    118119        sock->pending_reads--;
     
    130131                            uint16_t flags, void *private_data)
    131132{
    132         struct dcerpc_connection *p = talloc_get_type(private_data,
    133                                                       struct dcerpc_connection);
     133        struct dcecli_connection *p = talloc_get_type(private_data,
     134                                                      struct dcecli_connection);
    134135        struct sock_private *sock = (struct sock_private *)p->transport.private_data;
    135136
     
    151152   initiate a read request - not needed for dcerpc sockets
    152153*/
    153 static NTSTATUS sock_send_read(struct dcerpc_connection *p)
     154static NTSTATUS sock_send_read(struct dcecli_connection *p)
    154155{
    155156        struct sock_private *sock = (struct sock_private *)p->transport.private_data;
     
    164165   send an initial pdu in a multi-pdu sequence
    165166*/
    166 static NTSTATUS sock_send_request(struct dcerpc_connection *p, DATA_BLOB *data,
     167static NTSTATUS sock_send_request(struct dcecli_connection *p, DATA_BLOB *data,
    167168                                  bool trigger_read)
    168169{
     
    195196   shutdown sock pipe connection
    196197*/
    197 static NTSTATUS sock_shutdown_pipe(struct dcerpc_connection *p, NTSTATUS status)
     198static NTSTATUS sock_shutdown_pipe(struct dcecli_connection *p, NTSTATUS status)
    198199{
    199200        struct sock_private *sock = (struct sock_private *)p->transport.private_data;
     
    209210  return sock server name
    210211*/
    211 static const char *sock_peer_name(struct dcerpc_connection *p)
     212static const char *sock_peer_name(struct dcecli_connection *p)
    212213{
    213214        struct sock_private *sock = talloc_get_type(p->transport.private_data, struct sock_private);
     
    218219  return remote name we make the actual connection (good for kerberos)
    219220*/
    220 static const char *sock_target_hostname(struct dcerpc_connection *p)
     221static const char *sock_target_hostname(struct dcecli_connection *p)
    221222{
    222223        struct sock_private *sock = talloc_get_type(p->transport.private_data, struct sock_private);
     
    226227
    227228struct pipe_open_socket_state {
    228         struct dcerpc_connection *conn;
     229        struct dcecli_connection *conn;
    229230        struct socket_context *socket_ctx;
    230231        struct sock_private *sock;
     232        struct socket_address *localaddr;
    231233        struct socket_address *server;
    232234        const char *target_hostname;
     
    237239static void continue_socket_connect(struct composite_context *ctx)
    238240{
    239         struct dcerpc_connection *conn;
     241        struct dcecli_connection *conn;
    240242        struct sock_private *sock;
    241243        struct composite_context *c = talloc_get_type(ctx->async.private_data,
     
    305307
    306308static struct composite_context *dcerpc_pipe_open_socket_send(TALLOC_CTX *mem_ctx,
    307                                                        struct dcerpc_connection *cn,
     309                                                       struct dcecli_connection *cn,
     310                                                       struct socket_address *localaddr,
    308311                                                       struct socket_address *server,
    309312                                                       const char *target_hostname,
     
    324327        s->conn      = cn;
    325328        s->transport = transport;
     329        if (localaddr) {
     330                s->localaddr = talloc_reference(c, localaddr);
     331                if (composite_nomem(s->localaddr, c)) return c;
     332        }
    326333        s->server    = talloc_reference(c, server);
    327334        if (composite_nomem(s->server, c)) return c;
     
    338345        s->sock->path = talloc_reference(s->sock, full_path);
    339346
    340         conn_req = socket_connect_send(s->socket_ctx, NULL, s->server, 0,
     347        conn_req = socket_connect_send(s->socket_ctx, s->localaddr, s->server, 0,
    341348                                       c->event_ctx);
    342349        composite_continue(c, conn_req, continue_socket_connect, c);
     
    358365        const char *address;
    359366        uint32_t port;
     367        struct socket_address *localaddr;
    360368        struct socket_address *srvaddr;
    361369        struct resolve_context *resolve_ctx;
    362         struct dcerpc_connection *conn;
     370        struct dcecli_connection *conn;
    363371};
    364372
     
    386394
    387395        /* resolve_nbt_name gives only ipv4 ... - send socket open request */
    388         sock_ipv4_req = dcerpc_pipe_open_socket_send(c, s->conn,
     396        sock_ipv4_req = dcerpc_pipe_open_socket_send(c, s->conn, s->localaddr,
    389397                                                     s->srvaddr, s->target_hostname,
    390398                                                     NULL,
     
    420428
    421429        /* try IPv4 if IPv6 fails */
    422         sock_ipv4_req = dcerpc_pipe_open_socket_send(c, s->conn,
     430        sock_ipv4_req = dcerpc_pipe_open_socket_send(c, s->conn, s->localaddr,
    423431                                                     s->srvaddr, s->target_hostname,
    424432                                                     NCACN_IP_TCP);
     
    453461}
    454462
    455 
    456463/*
    457464  Send rpc pipe open request to given host:port using
    458465  tcp/ip transport
    459466*/
    460 struct composite_context* dcerpc_pipe_open_tcp_send(struct dcerpc_connection *conn,
     467struct composite_context* dcerpc_pipe_open_tcp_send(struct dcecli_connection *conn,
     468                                                    const char *localaddr,
    461469                                                    const char *server,
    462470                                                    const char *target_hostname,
     
    487495        s->conn            = conn;
    488496        s->resolve_ctx     = resolve_ctx;
     497        if (localaddr) {
     498                s->localaddr = socket_address_from_strings(s, "ip", localaddr, 0);
     499                /* if there is no localaddr, we pass NULL for
     500                   s->localaddr, which is handled by the socket libraries as
     501                   meaning no local binding address specified */
     502        }
    489503
    490504        make_nbt_name_server(&name, server);
     
    510524        const char *path;
    511525        struct socket_address *srvaddr;
    512         struct dcerpc_connection *conn;
     526        struct dcecli_connection *conn;
    513527};
    514528
     
    536550  Send pipe open request on unix socket
    537551*/
    538 struct composite_context *dcerpc_pipe_open_unix_stream_send(struct dcerpc_connection *conn,
     552struct composite_context *dcerpc_pipe_open_unix_stream_send(struct dcecli_connection *conn,
    539553                                                            const char *path)
    540554{
     
    561575
    562576        /* send socket open request */
    563         sock_unix_req = dcerpc_pipe_open_socket_send(c, s->conn,
     577        sock_unix_req = dcerpc_pipe_open_socket_send(c, s->conn, NULL,
    564578                                                     s->srvaddr, NULL,
    565579                                                     s->path,
     
    600614  Send pipe open request on ncalrpc
    601615*/
    602 struct composite_context* dcerpc_pipe_open_pipe_send(struct dcerpc_connection *conn,
     616struct composite_context* dcerpc_pipe_open_pipe_send(struct dcecli_connection *conn,
    603617                                                     const char *ncalrpc_dir,
    604618                                                     const char *identifier)
     
    632646
    633647        /* send socket open request */
    634         sock_np_req = dcerpc_pipe_open_socket_send(c, s->conn, s->srvaddr, NULL, s->path, NCALRPC);
     648        sock_np_req = dcerpc_pipe_open_socket_send(c, s->conn, NULL, s->srvaddr, NULL, s->path, NCALRPC);
    635649        composite_continue(c, sock_np_req, continue_np_open_socket, c);
    636650        return c;
     
    653667  Open a rpc pipe on a named pipe - sync version
    654668*/
    655 NTSTATUS dcerpc_pipe_open_pipe(struct dcerpc_connection *conn, const char *ncalrpc_dir, const char *identifier)
     669NTSTATUS dcerpc_pipe_open_pipe(struct dcecli_connection *conn, const char *ncalrpc_dir, const char *identifier)
    656670{
    657671        struct composite_context *c = dcerpc_pipe_open_pipe_send(conn, ncalrpc_dir, identifier);
     
    659673}
    660674
    661 const char *dcerpc_unix_socket_path(struct dcerpc_connection *p)
     675const char *dcerpc_unix_socket_path(struct dcecli_connection *p)
    662676{
    663677        struct sock_private *sock = (struct sock_private *)p->transport.private_data;
     
    665679}
    666680
    667 struct socket_address *dcerpc_socket_peer_addr(struct dcerpc_connection *p, TALLOC_CTX *mem_ctx)
     681struct socket_address *dcerpc_socket_peer_addr(struct dcecli_connection *p, TALLOC_CTX *mem_ctx)
    668682{
    669683        struct sock_private *sock = (struct sock_private *)p->transport.private_data;
  • vendor/current/source4/librpc/rpc/dcerpc_util.c

    r414 r740  
    3232#include "auth/credentials/credentials.h"
    3333#include "param/param.h"
     34#include "librpc/rpc/rpc_common.h"
    3435
    3536/*
     
    5253*/
    5354NTSTATUS ncacn_push_auth(DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
    54                          struct smb_iconv_convenience *iconv_convenience,
    55                           struct ncacn_packet *pkt,
    56                           struct dcerpc_auth *auth_info)
     55                         struct ncacn_packet *pkt,
     56                         struct dcerpc_auth *auth_info)
    5757{
    5858        struct ndr_push *ndr;
    5959        enum ndr_err_code ndr_err;
    6060
    61         ndr = ndr_push_init_ctx(mem_ctx, iconv_convenience);
     61        ndr = ndr_push_init_ctx(mem_ctx);
    6262        if (!ndr) {
    6363                return NT_STATUS_NO_MEMORY;
     
    8484
    8585        if (auth_info) {
     86#if 0
     87                /* the s3 rpc server doesn't handle auth padding in
     88                   bind requests. Use zero auth padding to keep us
     89                   working with old servers */
     90                uint32_t offset = ndr->offset;
     91                ndr_err = ndr_push_align(ndr, 16);
     92                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
     93                        return ndr_map_error2ntstatus(ndr_err);
     94                }
     95                auth_info->auth_pad_length = ndr->offset - offset;
     96#else
     97                auth_info->auth_pad_length = 0;
     98#endif
    8699                ndr_err = ndr_push_dcerpc_auth(ndr, NDR_SCALARS|NDR_BUFFERS, auth_info);
    87100                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
     
    107120        struct epm_twr_t twr;
    108121        struct epm_twr_t *twr_r;
     122        uint32_t num_towers;
    109123        struct epm_Map r;
    110124};
     
    112126
    113127static void continue_epm_recv_binding(struct composite_context *ctx);
    114 static void continue_epm_map(struct rpc_request *req);
     128static void continue_epm_map(struct tevent_req *subreq);
    115129
    116130
     
    121135static void continue_epm_recv_binding(struct composite_context *ctx)
    122136{
    123         struct rpc_request *map_req;
    124 
    125137        struct composite_context *c = talloc_get_type(ctx->async.private_data,
    126138                                                      struct composite_context);
    127139        struct epm_map_binding_state *s = talloc_get_type(c->private_data,
    128140                                                          struct epm_map_binding_state);
     141        struct tevent_req *subreq;
    129142
    130143        /* receive result of rpc pipe connect request */
    131144        c->status = dcerpc_pipe_connect_b_recv(ctx, c, &s->pipe);
    132145        if (!composite_is_ok(c)) return;
    133 
    134         s->pipe->conn->flags |= DCERPC_NDR_REF_ALLOC;
    135146
    136147        /* prepare requested binding parameters */
     
    146157        s->r.in.max_towers    = 1;
    147158        s->r.out.entry_handle = &s->handle;
     159        s->r.out.num_towers   = &s->num_towers;
    148160
    149161        /* send request for an endpoint mapping - a rpc request on connected pipe */
    150         map_req = dcerpc_epm_Map_send(s->pipe, c, &s->r);
    151         if (composite_nomem(map_req, c)) return;
    152        
    153         composite_continue_rpc(c, map_req, continue_epm_map, c);
     162        subreq = dcerpc_epm_Map_r_send(s, c->event_ctx,
     163                                       s->pipe->binding_handle,
     164                                       &s->r);
     165        if (composite_nomem(subreq, c)) return;
     166       
     167        tevent_req_set_callback(subreq, continue_epm_map, c);
    154168}
    155169
     
    158172  Stage 3 of epm_map_binding: Receive endpoint mapping and provide binding details
    159173*/
    160 static void continue_epm_map(struct rpc_request *req)
    161 {
    162         struct composite_context *c = talloc_get_type(req->async.private_data,
    163                                                       struct composite_context);
     174static void continue_epm_map(struct tevent_req *subreq)
     175{
     176        struct composite_context *c = tevent_req_callback_data(subreq,
     177                                      struct composite_context);
    164178        struct epm_map_binding_state *s = talloc_get_type(c->private_data,
    165179                                                          struct epm_map_binding_state);
    166180
    167181        /* receive result of a rpc request */
    168         c->status = dcerpc_ndr_request_recv(req);
     182        c->status = dcerpc_epm_Map_r_recv(subreq, s);
     183        TALLOC_FREE(subreq);
    169184        if (!composite_is_ok(c)) return;
    170185
     
    272287        epmapper_binding->target_hostname       = epmapper_binding->host;
    273288        epmapper_binding->options               = NULL;
     289        epmapper_binding->localaddress          = talloc_reference(epmapper_binding, binding->localaddress);
    274290        epmapper_binding->flags                 = 0;
    275291        epmapper_binding->assoc_group_id        = 0;
     
    408424        struct composite_context *auth_req;
    409425        struct dcerpc_pipe *p2;
     426        void *pp;
    410427
    411428        c = talloc_get_type(ctx->async.private_data, struct composite_context);
     
    416433        if (!composite_is_ok(c)) return;
    417434
     435
     436        /* this is a rather strange situation. When
     437           we come into the routine, s is a child of s->pipe, and
     438           when we created p2 above, it also became a child of
     439           s->pipe.
     440
     441           Now we want p2 to be a parent of s->pipe, and we want s to
     442           be a parent of both of them! If we don't do this very
     443           carefully we end up creating a talloc loop
     444        */
     445
     446        /* we need the new contexts to hang off the same context
     447           that s->pipe is on, but the only way to get that is
     448           via talloc_parent() */
     449        pp = talloc_parent(s->pipe);
     450
     451        /* promote s to be at the top */
     452        talloc_steal(pp, s);
     453
     454        /* and put p2 under s */
    418455        talloc_steal(s, p2);
     456
     457        /* now put s->pipe under p2 */
    419458        talloc_steal(p2, s->pipe);
     459
    420460        s->pipe = p2;
    421461
     
    423463        auth_req = dcerpc_bind_auth_send(c, s->pipe, s->table,
    424464                                         s->credentials,
    425                                          lp_gensec_settings(c, s->lp_ctx),
     465                                         lpcfg_gensec_settings(c, s->lp_ctx),
    426466                                         DCERPC_AUTH_TYPE_NTLMSSP,
    427467                                         dcerpc_auth_level(s->pipe->conn),
     
    456496        auth_req = dcerpc_bind_auth_send(c, s->pipe, s->table,
    457497                                         s->credentials,
    458                                          lp_gensec_settings(c, s->lp_ctx),
     498                                         lpcfg_gensec_settings(c, s->lp_ctx),
    459499                                         DCERPC_AUTH_TYPE_SPNEGO,
    460500                                         dcerpc_auth_level(s->pipe->conn),
     
    494534        struct composite_context *auth_req;
    495535        struct composite_context *auth_none_req;
    496         struct dcerpc_connection *conn;
     536        struct dcecli_connection *conn;
    497537        uint8_t auth_type;
    498538
     
    581621                auth_req = dcerpc_bind_auth_send(c, s->pipe, s->table,
    582622                                                 s->credentials,
    583                                                  lp_gensec_settings(c, s->lp_ctx),
     623                                                 lpcfg_gensec_settings(c, s->lp_ctx),
    584624                                                 DCERPC_AUTH_TYPE_SPNEGO,
    585625                                                 dcerpc_auth_level(conn),
     
    591631        auth_req = dcerpc_bind_auth_send(c, s->pipe, s->table,
    592632                                         s->credentials,
    593                                          lp_gensec_settings(c, s->lp_ctx),
     633                                         lpcfg_gensec_settings(c, s->lp_ctx),
    594634                                         auth_type,
    595635                                         dcerpc_auth_level(conn),
     
    648688
    649689
    650 NTSTATUS dcerpc_generic_session_key(struct dcerpc_connection *c,
     690NTSTATUS dcerpc_generic_session_key(struct dcecli_connection *c,
    651691                                    DATA_BLOB *session_key)
    652692{
     
    684724*/
    685725_PUBLIC_ void dcerpc_log_packet(const char *lockdir,
    686                                                                 const struct ndr_interface_table *ndr,
    687                        uint32_t opnum, uint32_t flags,
    688                       DATA_BLOB *pkt)
     726                                const struct ndr_interface_table *ndr,
     727                                uint32_t opnum, uint32_t flags,
     728                                const DATA_BLOB *pkt)
    689729{
    690730        const int num_examples = 20;
     
    741781        p2->binding = talloc_reference(p2, p->binding);
    742782
     783        p2->binding_handle = dcerpc_pipe_binding_handle(p2);
     784        if (p2->binding_handle == NULL) {
     785                talloc_free(p2);
     786                return NT_STATUS_NO_MEMORY;
     787        }
     788
    743789        status = dcerpc_alter_context(p2, p2, &p2->syntax, &p2->transfer_syntax);
    744790        if (!NT_STATUS_IS_OK(status)) {
  • vendor/current/source4/librpc/rpc/pyrpc.c

    r414 r740  
    33   Samba utility functions
    44   Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008
    5    
     5
    66   This program is free software; you can redistribute it and/or modify
    77   it under the terms of the GNU General Public License as published by
    88   the Free Software Foundation; either version 3 of the License, or
    99   (at your option) any later version.
    10    
     10
    1111   This program is distributed in the hope that it will be useful,
    1212   but WITHOUT ANY WARRANTY; without even the implied warranty of
    1313   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1414   GNU General Public License for more details.
    15    
     15
    1616   You should have received a copy of the GNU General Public License
    1717   along with this program.  If not, see <http://www.gnu.org/licenses/>.
    1818*/
    1919
     20#include <Python.h>
    2021#include "includes.h"
    21 #include <Python.h>
    2222#include <structmember.h>
    2323#include "librpc/rpc/pyrpc.h"
    24 #include "librpc/rpc/dcerpc.h"
    2524#include "lib/events/events.h"
    2625#include "param/pyparam.h"
     26#include "librpc/rpc/dcerpc.h"
     27#include "librpc/rpc/pyrpc_util.h"
    2728#include "auth/credentials/pycredentials.h"
    2829
    29 #ifndef Py_RETURN_NONE
    30 #define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
    31 #endif
    32 
    33 static PyObject *py_dcerpc_run_function(dcerpc_InterfaceObject *iface,
    34                                         const struct PyNdrRpcMethodDef *md,
    35                                         PyObject *args, PyObject *kwargs)
    36 {
    37         TALLOC_CTX *mem_ctx;
    38         NTSTATUS status;
    39         void *r;
    40         PyObject *result = Py_None;
    41 
    42         if (md->pack_in_data == NULL || md->unpack_out_data == NULL) {
    43                 PyErr_SetString(PyExc_NotImplementedError, "No marshalling code available yet");
    44                 return NULL;
    45         }
    46 
    47         mem_ctx = talloc_new(NULL);
    48         if (mem_ctx == NULL) {
    49                 PyErr_NoMemory();
    50                 return NULL;
    51         }
    52 
    53         r = talloc_zero_size(mem_ctx, md->table->calls[md->opnum].struct_size);
    54         if (r == NULL) {
    55                 PyErr_NoMemory();
    56                 return NULL;
    57         }
    58 
    59         if (!md->pack_in_data(args, kwargs, r)) {
    60                 talloc_free(mem_ctx);
    61                 return NULL;
    62         }
    63 
    64         status = md->call(iface->pipe, mem_ctx, r);
    65         if (NT_STATUS_IS_ERR(status)) {
    66                 PyErr_SetDCERPCStatus(iface->pipe, status);
    67                 talloc_free(mem_ctx);
    68                 return NULL;
    69         }
    70 
    71         result = md->unpack_out_data(r);
    72 
    73         talloc_free(mem_ctx);
    74         return result;
    75 }
    76 
    77 static PyObject *py_dcerpc_call_wrapper(PyObject *self, PyObject *args, void *wrapped, PyObject *kwargs)
    78 {       
    79         dcerpc_InterfaceObject *iface = (dcerpc_InterfaceObject *)self;
    80         const struct PyNdrRpcMethodDef *md = (const struct PyNdrRpcMethodDef *)wrapped;
    81 
    82         return py_dcerpc_run_function(iface, md, args, kwargs);
    83 }
    84 
    85 
    86 bool PyInterface_AddNdrRpcMethods(PyTypeObject *ifacetype, const struct PyNdrRpcMethodDef *mds)
    87 {
    88         int i;
    89         for (i = 0; mds[i].name; i++) {
    90                 PyObject *ret;
    91                 struct wrapperbase *wb = (struct wrapperbase *)calloc(sizeof(struct wrapperbase), 1);
    92 
    93                 wb->name = discard_const_p(char, mds[i].name);
    94                 wb->flags = PyWrapperFlag_KEYWORDS;
    95                 wb->wrapper = (wrapperfunc)py_dcerpc_call_wrapper;
    96                 wb->doc = discard_const_p(char, mds[i].doc);
    97                
    98                 ret = PyDescr_NewWrapper(ifacetype, wb, discard_const_p(void, &mds[i]));
    99 
    100                 PyDict_SetItemString(ifacetype->tp_dict, mds[i].name,
    101                                      (PyObject *)ret);
    102         }
    103 
    104         return true;
    105 }
     30void initbase(void);
     31
     32staticforward PyTypeObject dcerpc_InterfaceType;
    10633
    10734static bool PyString_AsGUID(PyObject *object, struct GUID *uuid)
     
    14774        PyErr_SetString(PyExc_TypeError, "Expected UUID or syntax id tuple");
    14875        return false;
    149 }       
     76}
    15077
    15178static PyObject *py_iface_server_name(PyObject *obj, void *closure)
     
    15380        const char *server_name;
    15481        dcerpc_InterfaceObject *iface = (dcerpc_InterfaceObject *)obj;
    155        
     82
    15683        server_name = dcerpc_server_name(iface->pipe);
    15784        if (server_name == NULL)
     
    207134        { NULL }
    208135};
    209 
    210 void PyErr_SetDCERPCStatus(struct dcerpc_pipe *p, NTSTATUS status)
    211 {
    212         if (p != NULL && NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
    213                 const char *errstr = dcerpc_errstr(NULL, p->last_fault_code);
    214                 PyErr_SetObject(PyExc_RuntimeError,
    215                         Py_BuildValue("(i,s)", p->last_fault_code,
    216                                       errstr));
    217         } else {
    218                 PyErr_SetNTSTATUS(status);
    219         }
    220 }
    221136
    222137static PyObject *py_iface_request(PyObject *self, PyObject *args, PyObject *kwargs)
     
    232147        struct GUID object_guid;
    233148        TALLOC_CTX *mem_ctx = talloc_new(NULL);
     149        uint32_t out_flags = 0;
    234150        const char *kwnames[] = { "opnum", "data", "object", NULL };
    235151
    236152        if (!PyArg_ParseTupleAndKeywords(args, kwargs, "is#|O:request",
    237153                discard_const_p(char *, kwnames), &opnum, &in_data, &in_length, &object)) {
     154                talloc_free(mem_ctx);
    238155                return NULL;
    239156        }
     
    245162
    246163        if (object != NULL && !PyString_AsGUID(object, &object_guid)) {
    247                 return NULL;
    248         }
    249 
    250         status = dcerpc_request(iface->pipe, object?&object_guid:NULL,
    251                                 opnum, mem_ctx, &data_in, &data_out);
    252 
    253         if (NT_STATUS_IS_ERR(status)) {
     164                talloc_free(mem_ctx);
     165                return NULL;
     166        }
     167
     168        status = dcerpc_binding_handle_raw_call(iface->binding_handle,
     169                                                object?&object_guid:NULL,
     170                                                opnum,
     171                                                0, /* in_flags */
     172                                                data_in.data,
     173                                                data_in.length,
     174                                                mem_ctx,
     175                                                &data_out.data,
     176                                                &data_out.length,
     177                                                &out_flags);
     178        if (!NT_STATUS_IS_OK(status)) {
    254179                PyErr_SetDCERPCStatus(iface->pipe, status);
    255180                talloc_free(mem_ctx);
     
    291216                                      &transfer_syntax);
    292217
    293         if (NT_STATUS_IS_ERR(status)) {
     218        if (!NT_STATUS_IS_OK(status)) {
    294219                PyErr_SetDCERPCStatus(iface->pipe, status);
    295220                return NULL;
     
    299224}
    300225
    301 PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs, const struct ndr_interface_table *table)
     226static PyMethodDef dcerpc_interface_methods[] = {
     227        { "request", (PyCFunction)py_iface_request, METH_VARARGS|METH_KEYWORDS, "S.request(opnum, data, object=None) -> data\nMake a raw request" },
     228        { "alter_context", (PyCFunction)py_iface_alter_context, METH_VARARGS|METH_KEYWORDS, "S.alter_context(syntax)\nChange to a different interface" },
     229        { NULL, NULL, 0, NULL },
     230};
     231
     232static void dcerpc_interface_dealloc(PyObject* self)
     233{
     234        dcerpc_InterfaceObject *interface = (dcerpc_InterfaceObject *)self;
     235        talloc_free(interface->mem_ctx);
     236        self->ob_type->tp_free(self);
     237}
     238
     239static PyObject *dcerpc_interface_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
    302240{
    303241        dcerpc_InterfaceObject *ret;
     
    305243        struct cli_credentials *credentials;
    306244        struct loadparm_context *lp_ctx = NULL;
    307         PyObject *py_lp_ctx = Py_None, *py_credentials = Py_None, *py_basis = Py_None;
    308         TALLOC_CTX *mem_ctx = NULL;
     245        PyObject *py_lp_ctx = Py_None, *py_credentials = Py_None;
     246        TALLOC_CTX *mem_ctx;
    309247        struct tevent_context *event_ctx;
    310248        NTSTATUS status;
    311249
     250        PyObject *syntax, *py_basis = Py_None;
    312251        const char *kwnames[] = {
    313                 "binding", "lp_ctx", "credentials", "basis_connection", NULL
     252                "binding", "syntax", "lp_ctx", "credentials", "basis_connection", NULL
    314253        };
    315 
    316         if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|OOO:samr", discard_const_p(char *, kwnames), &binding_string, &py_lp_ctx, &py_credentials, &py_basis)) {
    317                 return NULL;
    318         }
    319 
    320         lp_ctx = lp_from_py_object(py_lp_ctx);
     254        struct ndr_interface_table *table;
     255
     256        if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sO|OOO:connect", discard_const_p(char *, kwnames), &binding_string, &syntax, &py_lp_ctx, &py_credentials, &py_basis)) {
     257                return NULL;
     258        }
     259
     260        mem_ctx = talloc_new(NULL);
     261        if (mem_ctx == NULL) {
     262                PyErr_NoMemory();
     263                return NULL;
     264        }
     265
     266        lp_ctx = lpcfg_from_py_object(mem_ctx, py_lp_ctx);
    321267        if (lp_ctx == NULL) {
    322268                PyErr_SetString(PyExc_TypeError, "Expected loadparm context");
    323                 return NULL;
    324         }
    325 
    326         status = dcerpc_init(lp_ctx);
    327         if (!NT_STATUS_IS_OK(status)) {
    328                 PyErr_SetNTSTATUS(status);
    329                 return NULL;
    330         }
     269                talloc_free(mem_ctx);
     270                return NULL;
     271        }
     272
    331273        credentials = cli_credentials_from_py_object(py_credentials);
    332274        if (credentials == NULL) {
    333275                PyErr_SetString(PyExc_TypeError, "Expected credentials");
     276                talloc_free(mem_ctx);
    334277                return NULL;
    335278        }
    336279        ret = PyObject_New(dcerpc_InterfaceObject, type);
    337 
    338         event_ctx = event_context_init(mem_ctx);
     280        ret->mem_ctx = mem_ctx;
     281
     282        event_ctx = s4_event_context_init(ret->mem_ctx);
     283
     284        /* Create a dummy interface table struct. TODO: In the future, we should
     285         * rather just allow connecting without requiring an interface table.
     286         */
     287
     288        table = talloc_zero(ret->mem_ctx, struct ndr_interface_table);
     289
     290        if (table == NULL) {
     291                PyErr_SetString(PyExc_MemoryError, "Allocating interface table");
     292                talloc_free(mem_ctx);
     293                return NULL;
     294        }
     295
     296        if (!ndr_syntax_from_py_object(syntax, &table->syntax_id)) {
     297                talloc_free(mem_ctx);
     298                return NULL;
     299        }
     300
     301        ret->pipe = NULL;
     302        ret->binding_handle = NULL;
    339303
    340304        if (py_basis != Py_None) {
     
    347311                }
    348312
    349                 base_pipe = ((dcerpc_InterfaceObject *)py_basis)->pipe;
     313                base_pipe = talloc_reference(ret->mem_ctx,
     314                                         ((dcerpc_InterfaceObject *)py_basis)->pipe);
    350315
    351316                status = dcerpc_secondary_context(base_pipe, &ret->pipe, table);
     317
     318                ret->pipe = talloc_steal(ret->mem_ctx, ret->pipe);
    352319        } else {
    353                 status = dcerpc_pipe_connect(NULL, &ret->pipe, binding_string,
    354                              table, credentials, event_ctx, lp_ctx);
    355         }
    356         if (NT_STATUS_IS_ERR(status)) {
    357                 PyErr_SetNTSTATUS(status);
    358                 talloc_free(mem_ctx);
    359                 return NULL;
    360         }
    361 
     320                status = dcerpc_pipe_connect(ret->mem_ctx, &ret->pipe, binding_string,
     321                             table, credentials, event_ctx, lp_ctx);
     322        }
     323
     324        if (!NT_STATUS_IS_OK(status)) {
     325                PyErr_SetDCERPCStatus(ret->pipe, status);
     326                talloc_free(ret->mem_ctx);
     327                return NULL;
     328        }
    362329        ret->pipe->conn->flags |= DCERPC_NDR_REF_ALLOC;
     330        ret->binding_handle = ret->pipe->binding_handle;
    363331        return (PyObject *)ret;
    364332}
    365333
    366 static PyMethodDef dcerpc_interface_methods[] = {
    367         { "request", (PyCFunction)py_iface_request, METH_VARARGS|METH_KEYWORDS, "S.request(opnum, data, object=None) -> data\nMake a raw request" },
    368         { "alter_context", (PyCFunction)py_iface_alter_context, METH_VARARGS|METH_KEYWORDS, "S.alter_context(syntax)\nChange to a different interface" },
    369         { NULL, NULL, 0, NULL },
    370 };
    371 
    372 
    373 static void dcerpc_interface_dealloc(PyObject* self)
    374 {
    375         dcerpc_InterfaceObject *interface = (dcerpc_InterfaceObject *)self;
    376         talloc_free(interface->pipe);
    377         PyObject_Del(self);
    378 }
    379 
    380 static PyObject *dcerpc_interface_new(PyTypeObject *self, PyObject *args, PyObject *kwargs)
    381 {
    382         dcerpc_InterfaceObject *ret;
    383         const char *binding_string;
    384         struct cli_credentials *credentials;
    385         struct loadparm_context *lp_ctx = NULL;
    386         PyObject *py_lp_ctx = Py_None, *py_credentials = Py_None;
    387         TALLOC_CTX *mem_ctx = NULL;
    388         struct tevent_context *event_ctx;
    389         NTSTATUS status;
    390 
    391         PyObject *syntax, *py_basis = Py_None;
    392         const char *kwnames[] = {
    393                 "binding", "syntax", "lp_ctx", "credentials", "basis_connection", NULL
    394         };
    395         struct ndr_interface_table *table;
    396 
    397         if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sO|OOO:connect", discard_const_p(char *, kwnames), &binding_string, &syntax, &py_lp_ctx, &py_credentials, &py_basis)) {
    398                 return NULL;
    399         }
    400 
    401         lp_ctx = lp_from_py_object(py_lp_ctx);
    402         if (lp_ctx == NULL) {
    403                 PyErr_SetString(PyExc_TypeError, "Expected loadparm context");
    404                 return NULL;
    405         }
    406 
    407         credentials = cli_credentials_from_py_object(py_credentials);
    408         if (credentials == NULL) {
    409                 PyErr_SetString(PyExc_TypeError, "Expected credentials");
    410                 return NULL;
    411         }
    412         ret = PyObject_New(dcerpc_InterfaceObject, &dcerpc_InterfaceType);
    413 
    414         event_ctx = s4_event_context_init(mem_ctx);
    415 
    416         /* Create a dummy interface table struct. TODO: In the future, we should rather just allow
    417          * connecting without requiring an interface table.
    418          */
    419 
    420         table = talloc_zero(mem_ctx, struct ndr_interface_table);
    421 
    422         if (table == NULL) {
    423                 PyErr_SetString(PyExc_MemoryError, "Allocating interface table");
    424                 return NULL;
    425         }
    426 
    427         if (!ndr_syntax_from_py_object(syntax, &table->syntax_id)) {
    428                 return NULL;
    429         }
    430 
    431         ret->pipe = NULL;
    432 
    433         if (py_basis != Py_None) {
    434                 struct dcerpc_pipe *base_pipe;
    435 
    436                 if (!PyObject_TypeCheck(py_basis, &dcerpc_InterfaceType)) {
    437                         PyErr_SetString(PyExc_ValueError, "basis_connection must be a DCE/RPC connection");
    438                         talloc_free(mem_ctx);
    439                         return NULL;
    440                 }
    441 
    442                 base_pipe = ((dcerpc_InterfaceObject *)py_basis)->pipe;
    443 
    444                 status = dcerpc_secondary_context(base_pipe, &ret->pipe,
    445                                      table);
    446                 ret->pipe = talloc_steal(NULL, ret->pipe);
    447         } else {
    448                 status = dcerpc_pipe_connect(NULL, &ret->pipe, binding_string,
    449                              table, credentials, event_ctx, lp_ctx);
    450         }
    451 
    452         if (NT_STATUS_IS_ERR(status)) {
    453                 PyErr_SetDCERPCStatus(ret->pipe, status);
    454                 talloc_free(mem_ctx);
    455                 return NULL;
    456         }
    457         ret->pipe->conn->flags |= DCERPC_NDR_REF_ALLOC;
    458         return (PyObject *)ret;
    459 }
    460 
    461 PyTypeObject dcerpc_InterfaceType = {
     334static PyTypeObject dcerpc_InterfaceType = {
    462335        PyObject_HEAD_INIT(NULL) 0,
    463336        .tp_name = "dcerpc.ClientConnection",
  • vendor/current/source4/librpc/rpc/pyrpc.h

    r414 r740  
    2222
    2323#include "libcli/util/pyerrors.h"
    24 #include "librpc/rpc/dcerpc.h"
     24
     25#ifndef Py_TYPE /* Py_TYPE is only available on Python > 2.6 */
     26#define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
     27#endif
    2528
    2629#define PY_CHECK_TYPE(type, var, fail) \
    2730        if (!PyObject_TypeCheck(var, type)) {\
    28                 PyErr_Format(PyExc_TypeError, "Expected type %s", (type)->tp_name); \
     31                PyErr_Format(PyExc_TypeError, __location__ ": Expected type '%s' for '%s' of type '%s'", (type)->tp_name, #var, Py_TYPE(var)->tp_name); \
    2932                fail; \
    3033        }
     
    3740#define dom_sid28_Check dom_sid_Check
    3841
    39 /* This macro is only provided by Python >= 2.3 */
    40 #ifndef PyAPI_DATA
    41 #   define PyAPI_DATA(RTYPE) extern RTYPE
    42 #endif
    43 
    4442typedef struct {
    4543        PyObject_HEAD
     44        TALLOC_CTX *mem_ctx;
    4645        struct dcerpc_pipe *pipe;
     46        struct dcerpc_binding_handle *binding_handle;
    4747} dcerpc_InterfaceObject;
    4848
    49 PyAPI_DATA(PyTypeObject) dcerpc_InterfaceType;
    5049
    51 #define PyErr_FromNdrError(err) Py_BuildValue("(is)", err, ndr_map_error2string(err))
    52 
    53 #define PyErr_SetNdrError(err) \
    54                 PyErr_SetObject(PyExc_RuntimeError, PyErr_FromNdrError(err))
    55 
    56 void PyErr_SetDCERPCStatus(struct dcerpc_pipe *pipe, NTSTATUS status);
    57 
    58 typedef bool (*py_data_pack_fn) (PyObject *args, PyObject *kwargs, void *r);
    59 typedef PyObject *(*py_data_unpack_fn) (void *r);
    60 
    61 struct PyNdrRpcMethodDef {
    62         const char *name;
    63         const char *doc;
    64         dcerpc_call_fn call;
    65         py_data_pack_fn pack_in_data;
    66         py_data_unpack_fn unpack_out_data;
    67         uint32_t opnum;
    68         const struct ndr_interface_table *table;
    69 };
    70 
    71 bool PyInterface_AddNdrRpcMethods(PyTypeObject *object, const struct PyNdrRpcMethodDef *mds);
    72 PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs, const struct ndr_interface_table *table);
     50/*
     51  these prototypes should be generated by the python pidl backend, but
     52  aren't yet. They are needed when one module that has python access
     53  is accessed by another module
     54 */
     55union netr_LogonLevel *py_export_netr_LogonLevel(TALLOC_CTX *mem_ctx, int level, PyObject *in);
     56union netr_Validation;
     57PyObject *py_import_netr_Validation(TALLOC_CTX *mem_ctx, int level, union netr_Validation *in);
    7358
    7459#endif /* _PYRPC_H_ */
  • vendor/current/source4/librpc/tests/binding_string.c

    r414 r740  
    2525#include "librpc/rpc/dcerpc_proto.h"
    2626#include "torture/torture.h"
     27#include "lib/util/util_net.h"
    2728
    2829static bool test_BindingString(struct torture_context *tctx,
     
    128129        torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx,
    129130                "308FB580-1EB2-11CA-923B-08002B1075A7@ncacn_ip_tcp:$SERVER", &b), "parse");
     131        torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_ip_tcp:$SERVER[,sign,localaddress=192.168.1.1]", &b), "parse");
     132        torture_assert(tctx, b->transport == NCACN_IP_TCP, "ncacn_ip_tcp expected");
     133        torture_assert(tctx, b->flags == (DCERPC_SIGN | DCERPC_LOCALADDRESS), "sign flag");
     134        torture_assert_str_equal(tctx, b->localaddress, "192.168.1.1", "localaddress");
     135        torture_assert_str_equal(tctx, "ncacn_ip_tcp:$SERVER[,sign,localaddress=192.168.1.1]",
     136                                 dcerpc_binding_string(tctx, b), "back to string");
    130137
    131138        return true;
     
    156163{
    157164        int i;
    158         struct torture_suite *suite = torture_suite_create(mem_ctx, "BINDING");
     165        struct torture_suite *suite = torture_suite_create(mem_ctx, "binding");
    159166
    160167        for (i = 0; i < ARRAY_SIZE(test_strings); i++) {
Note: See TracChangeset for help on using the changeset viewer.