CVE-2016-2115: s4:libcli/raw: add smbcli_options.min_protocol
[samba.git] / source4 / libcli / raw / libcliraw.h
index 37e158a465d3a851ee223008780817e348432b8b..8220cd7c563513f05fb5c8a82c50e0f2b30d85b5 100644 (file)
 #ifndef __LIBCLI_RAW_H__
 #define __LIBCLI_RAW_H__
 
+#include "../libcli/smb/smb_common.h"
 #include "libcli/raw/request.h"
 #include "librpc/gen_ndr/nbt.h"
+#include "libcli/raw/interfaces.h"
 
 struct smbcli_tree;  /* forward declare */
 struct smbcli_request;  /* forward declare */
@@ -51,22 +53,18 @@ struct smbcli_negotiate {
        enum protocol_types protocol;
 
        uint8_t sec_mode;               /* security mode returned by negprot */
-       uint8_t key_len;
-       DATA_BLOB server_guid;      /* server_guid */
        DATA_BLOB secblob;      /* cryptkey or negTokenInit blob */
        uint32_t sesskey;
-       
-       struct smb_signing_context sign_info;
 
        /* capabilities that the server reported */
        uint32_t capabilities;
        
        int server_zone;
        time_t server_time;
-       uint_t readbraw_supported:1;
-       uint_t writebraw_supported:1;
 
-       char *server_domain;
+       unsigned int readbraw_supported:1;
+       unsigned int writebraw_supported:1;
+       unsigned int lockread_supported:1;
 };
        
 /* this is the context for a SMB socket associated with the socket itself */
@@ -92,44 +90,40 @@ struct smbcli_socket {
   client library
 */
 struct smbcli_options {
-       uint_t use_oplocks:1;
-       uint_t use_level2_oplocks:1;
-       uint_t use_spnego:1;
-       uint_t unicode:1;
-       uint_t ntstatus_support:1;
+       unsigned int use_oplocks:1;
+       unsigned int use_level2_oplocks:1;
+       unsigned int use_spnego:1;
+       unsigned int unicode:1;
+       unsigned int ntstatus_support:1;
+       int min_protocol;
        int max_protocol;
        uint32_t max_xmit;
        uint16_t max_mux;
        int request_timeout;
-       enum smb_signing_state signing;
+       enum smb_signing_setting signing;
+       uint32_t smb2_capabilities;
+       struct GUID client_guid;
 };
 
 /* this is the context for the client transport layer */
 struct smbcli_transport {
-       /* socket level info */
-       struct smbcli_socket *socket;
+       struct tevent_context *ev; /* TODO: remove this !!! */
+       struct smbXcli_conn *conn;
 
-       /* the next mid to be allocated - needed for signing and
-          request matching */
-       uint16_t next_mid;
-       
        /* negotiated protocol information */
        struct smbcli_negotiate negotiate;
 
        /* options to control the behaviour of the client code */
        struct smbcli_options options;
 
-       /* is a readbraw pending? we need to handle that case
-          specially on receiving packets */
-       uint_t readbraw_pending:1;
-       
        /* an idle function - if this is defined then it will be
           called once every period microseconds while we are waiting
           for a packet */
        struct {
                void (*func)(struct smbcli_transport *, void *);
                void *private_data;
-               uint_t period;
+               unsigned int period;
+               struct tevent_timer *te;
        } idle;
 
        /* the error fields from the last message */
@@ -142,7 +136,7 @@ struct smbcli_transport {
                              SOCKET_READ_ERROR,
                              SOCKET_WRITE_ERROR,
                              SOCKET_READ_BAD_SIG} socket_error;
-                       uint_t nbt_error;
+                       unsigned int nbt_error;
                } e;
        } error;
 
@@ -153,19 +147,7 @@ struct smbcli_transport {
                /* private data passed to the oplock handler */
                void *private_data;
        } oplock;
-
-       /* a list of async requests that are pending for receive on this connection */
-       struct smbcli_request *pending_recv;
-
-       /* remember the called name - some sub-protocols require us to
-          know the server name */
-       struct nbt_name called;
-
-       /* context of the stream -> packet parser */
-       struct packet_context *packet;
-
-       /* iconv convenience */
-       struct smb_iconv_convenience *iconv_convenience;
+       struct tevent_req *break_subreq;
 };
 
 /* this is the context for the user */
@@ -177,6 +159,7 @@ struct smbcli_session {
        
        /* after a session setup the server provides us with
           a vuid identifying the security context */
+       struct smbXcli_session *smbXcli;
        uint16_t vuid;
 
        /* default pid for this session */
@@ -186,15 +169,13 @@ struct smbcli_session {
           the user to control these for torture testing */
        uint16_t flags2;
 
-       DATA_BLOB user_session_key;
-
        /* the spnego context if we use extented security */
        struct gensec_security *gensec;
 
        struct smbcli_session_options {
-               uint_t lanman_auth:1;
-               uint_t ntlmv2_auth:1;
-               uint_t plaintext_auth:1;
+               unsigned int lanman_auth:1;
+               unsigned int ntlmv2_auth:1;
+               unsigned int plaintext_auth:1;
        } options;
 
        const char *os;
@@ -208,6 +189,7 @@ struct smbcli_tree {
        /* session layer info */
        struct smbcli_session *session;
 
+       struct smbXcli_tcon *smbXcli;
        uint16_t tid;                   /* tree id, aka cnum */
        char *device;
        char *fs_type;
@@ -226,8 +208,8 @@ enum smbcli_request_state {SMBCLI_REQUEST_INIT, /* we are creating the request *
  * functions (similar to context.h, the server version).
  * This will allow requests to be multi-threaded. */
 struct smbcli_request {
-       /* allow a request to be part of a list of requests */
-       struct smbcli_request *next, *prev;
+       /* smbXcli_req */
+       struct tevent_req *subreqs[2];
 
        /* each request is in one of 4 possible states */
        enum smbcli_request_state state;
@@ -238,14 +220,6 @@ struct smbcli_request {
        struct smbcli_session *session;
        struct smbcli_tree *tree;
 
-       /* a receive helper, smbcli_transport_finish_recv will not call
-          req->async.fn callback handler unless the recv_helper returns
-          a value > SMBCLI_REQUEST_RECV. */
-       struct {
-               enum smbcli_request_state (*fn)(struct smbcli_request *);
-               void *private_data;
-       } recv_helper;
-
        /* the flags2 from the SMB request, in raw form (host byte
           order). Used to parse strings */
        uint16_t flags2;
@@ -253,20 +227,6 @@ struct smbcli_request {
        /* the NT status for this request. Set by packet receive code
           or code detecting error. */
        NTSTATUS status;
-       
-       /* the sequence number of this packet - used for signing */
-       uint_t seq_num;
-
-       /* list of ntcancel request for this requests */
-       struct smbcli_request *ntcancel;
-
-       /* set if this is a one-way request, meaning we are not
-          expecting a reply from the server. */
-       uint_t one_way_request:1;
-
-       /* set this when the request should only increment the signing
-          counter by one */
-       uint_t sign_single_increment:1;
 
        /* the caller wants to do the signing check */
        bool sign_caller_checks;
@@ -274,12 +234,12 @@ struct smbcli_request {
        /* give the caller a chance to prevent the talloc_free() in the _recv() function */
        bool do_not_free;
 
-       /* the mid of this packet - used to match replies */
-       uint16_t mid;
-
        struct smb_request_buffer in;
        struct smb_request_buffer out;
 
+       struct smb_trans2 trans2;
+       struct smb_nttrans nttrans;
+
        /* information on what to do with a reply when it is received
           asyncronously. If this is not setup when a reply is received then
           the reply is discarded
@@ -306,8 +266,6 @@ struct smbcli_request {
       goto failed; \
 }
 
-#include "libcli/raw/interfaces.h" 
-
 NTSTATUS smb_raw_read_recv(struct smbcli_request *req, union smb_read *parms);
 struct smbcli_request *smb_raw_read_send(struct smbcli_tree *tree, union smb_read *parms);
 NTSTATUS smb_raw_trans_recv(struct smbcli_request *req,
@@ -317,6 +275,7 @@ size_t smb_raw_max_trans_data(struct smbcli_tree *tree, size_t param_size);
 struct smbcli_request *smb_raw_trans_send(struct smbcli_tree *tree, struct smb_trans2 *parms);
 NTSTATUS smbcli_request_destroy(struct smbcli_request *req);
 struct smbcli_request *smb_raw_write_send(struct smbcli_tree *tree, union smb_write *parms);
+NTSTATUS smb_raw_write_recv(struct smbcli_request *req, union smb_write *parms);
 struct smbcli_request *smb_raw_close_send(struct smbcli_tree *tree, union smb_close *parms);
 NTSTATUS smb_raw_open_recv(struct smbcli_request *req, TALLOC_CTX *mem_ctx, union smb_open *parms);
 struct smbcli_request *smb_raw_open_send(struct smbcli_tree *tree, union smb_open *parms);
@@ -324,6 +283,7 @@ struct smbcli_request *smb_raw_open_send(struct smbcli_tree *tree, union smb_ope
 bool smbcli_transport_process(struct smbcli_transport *transport);
 const char *smbcli_errstr(struct smbcli_tree *tree);
 NTSTATUS smb_raw_fsinfo(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_fsinfo *fsinfo);
+NTSTATUS smb_raw_setfsinfo(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_setfsinfo *set_fsinfo);
 NTSTATUS smb_raw_pathinfo(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_fileinfo *parms);
 NTSTATUS smb_raw_shadow_data(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, struct smb_shadow_copy *info);
 NTSTATUS smb_raw_fileinfo(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_fileinfo *parms);
@@ -377,11 +337,4 @@ NTSTATUS smb_raw_trans(struct smbcli_tree *tree,
                       TALLOC_CTX *mem_ctx,
                       struct smb_trans2 *parms);
 
-struct smbcli_socket *smbcli_sock_connect_byname(const char *host, const char **ports,
-                                                TALLOC_CTX *mem_ctx,
-                                                struct resolve_context *resolve_ctx,
-                                                struct tevent_context *event_ctx,
-                                                const char *socket_options);
-void smbcli_sock_dead(struct smbcli_socket *sock);
-
 #endif /* __LIBCLI_RAW__H__ */