X-Git-Url: http://git.samba.org/?a=blobdiff_plain;f=librpc%2Frpc%2Frpc_common.h;h=978229ef24a0feec88bf2953daf4924b40a2f5b0;hb=a33b13bd6133585323129fa248646c4bc0ac4732;hp=69ee69411a725b84a725dde266313abe296a5d8b;hpb=83c55ac67e488787a264f3981eabb6f69e7b0e87;p=mat%2Fsamba.git diff --git a/librpc/rpc/rpc_common.h b/librpc/rpc/rpc_common.h index 69ee69411a..978229ef24 100644 --- a/librpc/rpc/rpc_common.h +++ b/librpc/rpc/rpc_common.h @@ -30,6 +30,7 @@ struct ndr_push; struct ndr_pull; struct ncacn_packet; struct epm_floor; +struct epm_tower; struct tevent_context; struct tstream_context; @@ -38,6 +39,80 @@ enum dcerpc_transport_t { NCACN_VNS_SPP, NCACN_AT_DSP, NCADG_AT_DDP, NCALRPC, NCACN_UNIX_STREAM, NCADG_UNIX_DGRAM, NCACN_HTTP, NCADG_IPX, NCACN_SPX, NCACN_INTERNAL }; +/** this describes a binding to a particular transport/pipe */ +struct dcerpc_binding { + enum dcerpc_transport_t transport; + struct ndr_syntax_id object; + const char *host; + const char *target_hostname; + const char *target_principal; + const char *endpoint; + const char **options; + const char *localaddress; + uint32_t flags; + uint32_t assoc_group_id; +}; + +/* dcerpc pipe flags */ +#define DCERPC_DEBUG_PRINT_IN (1<<0) +#define DCERPC_DEBUG_PRINT_OUT (1<<1) +#define DCERPC_DEBUG_PRINT_BOTH (DCERPC_DEBUG_PRINT_IN | DCERPC_DEBUG_PRINT_OUT) + +#define DCERPC_DEBUG_VALIDATE_IN (1<<2) +#define DCERPC_DEBUG_VALIDATE_OUT (1<<3) +#define DCERPC_DEBUG_VALIDATE_BOTH (DCERPC_DEBUG_VALIDATE_IN | DCERPC_DEBUG_VALIDATE_OUT) + +#define DCERPC_CONNECT (1<<4) +#define DCERPC_SIGN (1<<5) +#define DCERPC_SEAL (1<<6) + +#define DCERPC_PUSH_BIGENDIAN (1<<7) +#define DCERPC_PULL_BIGENDIAN (1<<8) + +#define DCERPC_SCHANNEL (1<<9) + +#define DCERPC_ANON_FALLBACK (1<<10) + +/* use a 128 bit session key */ +#define DCERPC_SCHANNEL_128 (1<<12) + +/* check incoming pad bytes */ +#define DCERPC_DEBUG_PAD_CHECK (1<<13) + +/* set LIBNDR_FLAG_REF_ALLOC flag when decoding NDR */ +#define DCERPC_NDR_REF_ALLOC (1<<14) + +#define DCERPC_AUTH_OPTIONS (DCERPC_SEAL|DCERPC_SIGN|DCERPC_SCHANNEL|DCERPC_AUTH_SPNEGO|DCERPC_AUTH_KRB5|DCERPC_AUTH_NTLM) + +/* select spnego auth */ +#define DCERPC_AUTH_SPNEGO (1<<15) + +/* select krb5 auth */ +#define DCERPC_AUTH_KRB5 (1<<16) + +#define DCERPC_SMB2 (1<<17) + +/* select NTLM auth */ +#define DCERPC_AUTH_NTLM (1<<18) + +/* this triggers the DCERPC_PFC_FLAG_CONC_MPX flag in the bind request */ +#define DCERPC_CONCURRENT_MULTIPLEX (1<<19) + +/* this triggers the DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN flag in the bind request */ +#define DCERPC_HEADER_SIGNING (1<<20) + +/* use NDR64 transport */ +#define DCERPC_NDR64 (1<<21) + +/* specify binding interface */ +#define DCERPC_LOCALADDRESS (1<<22) + +/* handle upgrades or downgrades automatically */ +#define DCERPC_SCHANNEL_AUTO (1<<23) + +/* use aes schannel with hmac-sh256 session key */ +#define DCERPC_SCHANNEL_AES (1<<24) + /* The following definitions come from ../librpc/rpc/dcerpc_error.c */ const char *dcerpc_errstr(TALLOC_CTX *mem_ctx, uint32_t fault_code); @@ -48,6 +123,19 @@ NTSTATUS dcerpc_fault_to_nt_status(uint32_t fault_code); const char *epm_floor_string(TALLOC_CTX *mem_ctx, struct epm_floor *epm_floor); const char *dcerpc_floor_get_rhs_data(TALLOC_CTX *mem_ctx, struct epm_floor *epm_floor); enum dcerpc_transport_t dcerpc_transport_by_endpoint_protocol(int prot); +struct dcerpc_binding *dcerpc_binding_dup(TALLOC_CTX *mem_ctx, + const struct dcerpc_binding *b); +NTSTATUS dcerpc_binding_build_tower(TALLOC_CTX *mem_ctx, + const struct dcerpc_binding *binding, + struct epm_tower *tower); +NTSTATUS dcerpc_binding_from_tower(TALLOC_CTX *mem_ctx, + struct epm_tower *tower, + struct dcerpc_binding **b_out); +NTSTATUS dcerpc_parse_binding(TALLOC_CTX *mem_ctx, const char *s, struct dcerpc_binding **b_out); +char *dcerpc_binding_string(TALLOC_CTX *mem_ctx, const struct dcerpc_binding *b); +NTSTATUS dcerpc_floor_get_lhs_data(const struct epm_floor *epm_floor, struct ndr_syntax_id *syntax); +const char *derpc_transport_string_by_transport(enum dcerpc_transport_t t); +enum dcerpc_transport_t dcerpc_transport_by_tower(const struct epm_tower *tower); /* The following definitions come from ../librpc/rpc/dcerpc_util.c */ @@ -55,6 +143,9 @@ void dcerpc_set_frag_length(DATA_BLOB *blob, uint16_t v); uint16_t dcerpc_get_frag_length(const DATA_BLOB *blob); void dcerpc_set_auth_length(DATA_BLOB *blob, uint16_t v); uint8_t dcerpc_get_endian_flag(DATA_BLOB *blob); +const char *dcerpc_default_transport_endpoint(TALLOC_CTX *mem_ctx, + enum dcerpc_transport_t transport, + const struct ndr_interface_table *table); /** * @brief Pull a dcerpc_auth structure, taking account of any auth @@ -98,6 +189,10 @@ struct dcerpc_binding_handle_ops { uint32_t (*set_timeout)(struct dcerpc_binding_handle *h, uint32_t timeout); + void (*auth_info)(struct dcerpc_binding_handle *h, + enum dcerpc_AuthType *auth_type, + enum dcerpc_AuthLevel *auth_level); + struct tevent_req *(*raw_call_send)(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct dcerpc_binding_handle *h, @@ -168,6 +263,10 @@ bool dcerpc_binding_handle_is_connected(struct dcerpc_binding_handle *h); uint32_t dcerpc_binding_handle_set_timeout(struct dcerpc_binding_handle *h, uint32_t timeout); +void dcerpc_binding_handle_auth_info(struct dcerpc_binding_handle *h, + enum dcerpc_AuthType *auth_type, + enum dcerpc_AuthLevel *auth_level); + struct tevent_req *dcerpc_binding_handle_raw_call_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct dcerpc_binding_handle *h, @@ -181,6 +280,16 @@ NTSTATUS dcerpc_binding_handle_raw_call_recv(struct tevent_req *req, uint8_t **out_data, size_t *out_length, uint32_t *out_flags); +NTSTATUS dcerpc_binding_handle_raw_call(struct dcerpc_binding_handle *h, + const struct GUID *object, + uint32_t opnum, + uint32_t in_flags, + const uint8_t *in_data, + size_t in_length, + TALLOC_CTX *mem_ctx, + uint8_t **out_data, + size_t *out_length, + uint32_t *out_flags); struct tevent_req *dcerpc_binding_handle_disconnect_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,